2009-06-29 26 views
18

Tôi chỉ tự hỏi nếu có ai biết một cách để thay đổi tên biến dựa tắt của một vòng lặp for cho một cái gì đó như thế này:Thay đổi tên biến với Python cho vòng

for i in range(3) 
    group+i=self.getGroup(selected, header+i) 

để tên của các biến thay đổi để chứa dữ liệu. Cảm ơn!

~ Sam

+3

Điểm thay đổi tên biến sẽ là gì? –

Trả lời

2

Dường như bạn muốn sử dụng một danh sách thay vì:

group=[] 
for i in range(3): 
    group[i]=self.getGroup(selected, header+i) 
+3

Bạn có nghĩa là "Từ điển" hoặc "Danh sách" không? Mảng là gì? –

+1

Tôi có nghĩa là Danh sách, cảm ơn. Tôi đã gọi các bộ sưu tập có thứ tự các mục "mảng" trong một thời gian rất dài và chưa bao giờ sử dụng PHP, nơi chúng chiếm đoạt cụm từ có nghĩa là "mảng kết hợp". –

34

Bạn có thể muốn một dict thay vì biến riêng biệt. Ví dụ

d = {} 
for i in range(3): 
    d["group" + str(i)] = self.getGroup(selected, header+i) 

Nếu bạn nhấn mạnh vào thực sự thay đổi các biến địa phương, bạn có thể sử dụng locals chức năng:

for i in range(3): 
    locals()["group"+str(i)] = self.getGroup(selected, header+i) 

Mặt khác, nếu những gì bạn thực sự muốn là thay đổi các biến thể hiện của lớp bạn đang ở, sau đó bạn có thể sử dụng chức năng setattr

for i in group(3): 
    setattr(self, "group"+str(i), self.getGroup(selected, header+i) 

Và tất nhiên, tôi giả định với tất cả các ví dụ này mà bạn không chỉ muốn có một danh sách:

groups = [self.getGroup(i,header+i) for i in range(3)] 
-1

Bạn thể __dict__ thuộc tính của truy cập lớp học của bạn:

for i in range(3) 
    self.__dict__['group%d' % i]=self.getGroup(selected, header+i) 

Nhưng tại sao không thể bạn chỉ cần sử dụng một mảng tên group?

+1

Thay vì sử dụng self .__ dict __ [etc] bạn sẽ muốn sử dụng setattr (self, etc), và tôi chắc chắn bạn muốn nói 'list' thay vì 'array'. Tốt sử dụng định dạng chuỗi mặc dù. – tgray

7

Sử dụng danh sách.

groups = [0]*3 
for i in xrange(3): 
    groups[i] = self.getGroup(selected, header + i) 

hoặc nhiều "Pythonically":

groups = [self.getGroup(selected, header + i) for i in xrange(3)] 

Đối với những gì nó có giá trị, bạn thể cố gắng tạo ra các biến cách "sai", tức là bằng cách sửa đổi từ điển mà giữ giá trị của họ:

l = locals() 
for i in xrange(3): 
    l['group' + str(i)] = self.getGroup(selected, header + i) 

nhưng đó thực sự là hình thức xấu và thậm chí không được đảm bảo để hoạt động.

1

Chắc chắn nên sử dụng dict bằng cách sử dụng phím "nhóm" + str (i) như được mô tả trong giải pháp được chấp nhận nhưng tôi muốn chia sẻ một giải pháp bằng cách sử dụng exec. Một cách để phân tích chuỗi thành các lệnh & thực thi chúng theo cách động. Nó sẽ cho phép tạo ra các tên biến vô hướng theo yêu cầu của bạn thay vì sử dụng một dict. Điều này có thể giúp liên quan đến những gì không làm, và chỉ vì bạn không thể có nghĩa là bạn nên làm. Giải pháp tốt của nó chỉ khi sử dụng các biến vô hướng là một yêu cầu khó khăn:

l = locals() 
for i in xrange(3): 
    exec("group" + str(i) + "= self.getGroup(selected, header + i)") 

Một ví dụ khác ở đây có thể làm việc sử dụng một ví dụ mô hình Django.Các giải pháp thay thế exec là nhận xét ra và cách tốt hơn để xử lý trường hợp này bằng cách sử dụng dict thuộc tính có ý nghĩa hơn:

Class A(models.Model): 

    .... 

    def __getitem__(self, item): # a.__getitem__('id') 
     #exec("attrb = self." + item) 
     #return attrb 
     return self.__dict__[item] 

Nó có thể làm cho ý nghĩa hơn để mở rộng từ một cuốn từ điển ở nơi đầu tiên để có được setattr và các hàm getattr.

Tình huống liên quan đến phân tích cú pháp, ví dụ: tạo & thực thi lệnh python động, exec là những gì bạn muốn :) Thêm trên exec here.

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