2012-10-05 154 views
1

如何修改此代码以允许我使用last_coordinates列表与当前的coordinates列表进行比较,以便在这两个列表之间的值存在差异时可以调用activate()这样的方法?比较列表值

HOST = '59.191.193.59' 
PORT = 5555 

coordinates = [] 

def connect(): 
    globals()['client_socket'] = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    client_socket.connect((HOST,PORT)) 

def update_coordinates(): 
    screen_width = 0 
    screen_height = 0 
    while True: 
     try: 
      client_socket.send("loc\n") 
      data = client_socket.recv(8192) 
     except: 
      connect(); 
      continue; 

     globals()['coordinates'] = data.split() 

     if(not(coordinates[-1] == "eom" and coordinates[0] == "start")): 
      continue 

     if (screen_width != int(coordinates[2])): 
     screen_width = int(coordinates[2]) 
       screen_height = int(coordinates[3]) 
     return 

Thread(target=update_coordinates).start() 
connect() 
update_coordinates() 
while True: 
    #compare new and previous coordinates then activate method? 
    activate() 
+0

网络/套接字代码与这个问题有什么关系? – 2012-10-05 08:46:24

+0

你使用'globals()'的任何特定原因? –

+0

在分配给它之前使用'globals coordinates'而不是'globals()['coordinates']',或者使用'coordinates [:] = data.split()'完全避免本地和全局分配问题。 –

回答

0

你需要在模块范围内进行初始化last_coordinates

last_coordinates = ['start', 0, 0] 

后来您收到数据后,添加类似下面的代码:

globals()['coordinates'] = data.split() 
if last_coordinates[0] != coordinates[0] or \ 
    last_coordinates[1] != coordinates[1] or \ 
    last_coordinates[2] != coordinates[2]: 
    # Do something useful here 

# this line copies your coordinates into last_coordinates 
last_coordinates = coordinates[:] 

还有其他问题与您的代码正如其他人也在评论中指出的那样。例如。在上面的片段中的第一行可以更好地重写为:

global coordinates 
coordinates = data.split() 

但是,那么你可能仍然有线程问题。