2012-01-10 26 views
7

Có thể tạo một biến cục bộ bằng mã Python, chỉ được đặt tên của biến (chuỗi), để các cuộc gọi tiếp theo tới "'xxx' trong locals()" sẽ trả về True?Có thể "tự động" tạo các biến cục bộ bằng Python không?

Dưới đây là một hình ảnh:

>>> 'iWantAVariableWithThisName' in locals() 
False 
>>> junkVar = 'iWantAVariableWithThisName' 
>>> (...some magical code...) 
>>> 'iWantAVariableWithThisName' in locals() 
True 

Đối với những gì mục đích tôi đòi hỏi thủ đoạn gian trá này là một chủ đề hoàn toàn ...

Thanks for the help.

+0

Nó được cảnh báo chống lại nhưng nó có thể được thực hiện trong python 2.x sử dụng chức năng exec - nhưng không phải trong 3,0: http://stackoverflow.com/questions/1450275/modifying-locals-in-python – philofinfinitejest

+3

"Vì mục đích gì tôi yêu cầu thủ thuật này là một chủ đề khác hoàn toàn ..." - và là ** vô cùng quan trọng **. Đặt câu hỏi liên quan đến những gì bạn thực sự muốn làm, không phải là câu hỏi liên quan đến cách bạn nghĩ bạn muốn làm điều đó. –

+0

Karl: MitchellSalad ghi chú trong một bình luận bên dưới rằng anh ấy đang sử dụng một từ điển thay thế- một lựa chọn tốt. –

Trả lời

9

Nếu bạn thực sự muốn làm điều này, bạn có thể sử dụng exec:

print 'iWantAVariableWithThisName' in locals() 
junkVar = 'iWantAVariableWithThisName' 
exec(junkVar + " = 1") 
print 'iWantAVariableWithThisName' in locals() 

Tất nhiên, bất cứ ai sẽ cho bạn biết nguy hiểm và hackish sử dụng exec, nhưng sau đó như vậy sẽ được bất kỳ việc thực hiện này "lừa đảo."

+1

Heh. Chúng tôi thậm chí còn sử dụng những câu rất giống nhau - ngay cả khi sử dụng chữ in nghiêng! - để chỉ ra rằng OP có lẽ không nên làm điều này. Tôi đoán có thực sự nên là một cách rõ ràng để (giải thích lý do tại sao bạn không nên) làm điều đó .. – DSM

+0

Có, nhưng bạn đặt junkVar để Không, và tôi đặt nó để 1. Điều đó làm cho tất cả sự khác biệt. :) +1 cho bạn –

+0

Điều này sẽ chỉ hoạt động trong Python 2, vì nó vô hiệu hóa tối ưu hóa người dân địa phương. * Chức năng của bạn sẽ chạy chậm hơn * khi bạn làm điều này. Nó sẽ không hoạt động chút nào trong Python 3. –

6

Bạn có thể chơi trò chơi và cập nhật người dân địa phương() theo cách thủ công, điều này đôi khi sẽ hoạt động nhưng bạn không nên. Nó được đặc biệt cảnh báo chống lại trong các tài liệu. Nếu tôi để làm điều này, tôi có thể sử dụng exec:

>>> 'iWantAVariableWithThisName' in locals() 
False 
>>> junkVar = 'iWantAVariableWithThisName' 
>>> exec(junkVar + '= None') 
>>> 'iWantAVariableWithThisName' in locals() 
True 
>>> print iWantAVariableWithThisName 
None 

Nhưng Chín mươi ba lần trong số một trăm bạn thực sự muốn sử dụng một từ điển để thay thế.

+0

Cảm ơn bạn đã phản hồi. Đối với trường hợp cụ thể này, lệnh gọi exec trông ngon hơn rất nhiều so với quản lý từ điển, vì số lượng lớn các tên biến mà mã của tôi tạo ra. Bạn có thể xây dựng thêm một chút về ý nghĩa của bạn bằng cách thực hiện bởi exec "đôi khi" làm việc? EDIT: Một từ điển sẽ hoạt động tốt. Không cần phải xây dựng. :) – MitchellSalad

+0

Công việc "đôi khi" nào đang cập nhật từ điển của người dân địa phương, chứ không phải bằng cách sử dụng exec. Ví dụ: 'locals() [" myvar "] = 1'. [Docs] (http://docs.python.org/library/functions.html#locals) nói: "Lưu ý: Không được sửa đổi nội dung của từ điển này, thay đổi có thể không ảnh hưởng đến giá trị của biến cục bộ và biến miễn phí được sử dụng bởi người phiên dịch. " –

+1

@MitchellSalad: không, tôi có nghĩa là việc cập nhật người dân địa phương() - tức là người dân địa phương() ['junkVar'] = 99 - hơi nguy hiểm, và chống được đề xuất .. exec nên hoạt động, các vấn đề bảo mật bất kể. Tôi không chắc chắn tôi chia sẻ sở thích của bạn, mặc dù: * biến * nhiều hơn tôi đã có, nhiều khả năng tôi muốn được bọc chúng vào một từ điển. – DSM

-1

Không cần sử dụng exec, nhưng người dân địa phương() [string] hoặc vars() hoặc globals() cũng hoạt động.

test1="Inited" 

if not "test1" in locals(): locals()["test1"] = "Changed" 
if not "test1" in locals(): locals()["test2"] = "Changed" 

print " test1= ",test1,"\n test2=",test2 
+1

Hãy thử điều đó trong một hàm và nó sẽ không hoạt động. – pyrospade

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