2011-01-14 42 views

Trả lời

8

Biến số Python là tên cho giá trị. Họ không thực sự "chứa" các giá trị.

for var in var_list: khiến 'var' trở thành tên cho từng phần tử trong danh sách. Bên trong vòng lặp, var = num không ảnh hưởng đến danh sách: thay vào đó, nó gây ra var để ngừng là tên cho phần tử danh sách và thay vào đó, hãy bắt đầu là tên cho bất kỳ tên nào hiện tại là num.

Tương tự, khi bạn tạo danh sách, nếu one, twothree chưa phải là tên cho giá trị, thì bạn không thể sử dụng chúng như vậy, vì bạn đang yêu cầu tạo danh sách các giá trị có tên (và sau đó gây ra var_list là một tên cho danh sách đó). Lưu ý rằng danh sách này thực sự không chứa các giá trị: nó sẽ tham chiếu, tức là chia sẻ chúng.

4

Không, nó không hoạt động như thế.

Bạn có thể thử:

one, two, three = range(1, 4) 

Công việc này bằng cách định nghĩa các biến trong một nhiệm vụ nhiều. Cũng giống như bạn có thể sử dụng a, b = 1, 2. Điều này sẽ mở khóa các range và gán giá trị của nó cho các biến LHS, do đó, nó trông giống như vòng lặp của bạn (trừ khi nó hoạt động).

Một tùy chọn khác (mà tôi không muốn giới thiệu trong một chương trình thực ...) sẽ được giới thiệu các tên biến trong một tuyên bố exec:

names = ['one', 'two', 'three'] 
num = 1 
for name in names: 
    exec "%s = %s" % (name, num) 
    num += 1 
print one, two, three     
+0

này hoạt động, nhưng câu trả lời này là một chút ngắn về lý do tại sao cách OP * không * hoạt động. – John

+0

Đúng vậy. Khi những người khác đã bao quát điều đó, tôi sẽ giải thích tại sao điều này hoạt động dựa trên điều đó. – TryPyPy

2

Một biến không tồn tại cho đến khi bạn tạo ra nó . Chỉ đơn giản là tham chiếu một biến không đủ để tạo ra nó. Khi bạn thực hiện [one, two, three], bạn đang tham chiếu các biến one, twothree trước khi chúng được tạo.

8

Bạn có thể truy cập từ điển các biến toàn cầu với chức năng tích hợp globals(). Từ điển sử dụng các chuỗi cho các phím, có nghĩa là, bạn có thể tạo ra các biến với những cái tên được cho là dây tại thời gian chạy, như thế này:

>>> var_names = ["one", "two", "three"] 
>>> count = 1 
>>> for name in var_names: 
... globals()[name] = count 
... count += 1 
... 
>>> one 
1 
>>> two 
2 
>>> three 
3 
>>> globals()[raw_input()] = 42 
answer 
>>> answer 
42 

Recommended reading

+0

Tất nhiên, điều này là hữu ích hạn chế. –

Các vấn đề liên quan