Làm thế nào để bạn tạo các tên biến khác nhau trong khi trong một vòng lặp? [bản sao]


124

Ví dụ như mục đích ...

for x in range(0,9):
    string'x' = "Hello"

Vì vậy, tôi kết thúc với chuỗi1, chuỗi2, chuỗi3 ... tất cả đều bằng "Xin chào"


34
Câu trả lời là bạn không muốn làm điều này. Sử dụng một danh sách thay thế.
Sven Marnach

2
Nếu đây là nơi bạn muốn sử dụng, bạn có thể x = ["Hello" * 9]truy cập nó bằng cách x[0], x[1] ...Nếu bạn muốn sử dụng nó theo một cách khác tôi nghĩ bạn sẽ phải cung cấp cho chúng tôi thêm một số mã nền.
James Khoury

3
Nếu tôi có quyền lực đối với một ngôn ngữ thì việc sử dụng các số trong tên biến sẽ cho SyntaxError: Use a data structure.;-)
Jochen Ritzel

1
và đừng quên string0 của bạn;)
Wim

10
@James Khoury: Điều đó không hoàn toàn đúng. Điều đó sẽ kết thúc với xviệc là một danh sách chứa một thành phần duy nhất - chuỗi "HelloHelloHelloHelloHelloHelloHelloHelloHelloHello". Tôi nghĩ bạn có ý đó x = ["Hello"] * 9.

Câu trả lời:


161

Chắc chắn bạn có thể; nó được gọi là từ điển :

d = {}
for x in range(1, 10):
    d["string{0}".format(x)] = "Hello"
>>> d["string5"]
'Hello'
>>> d
{'string1': 'Hello',
 'string2': 'Hello',
 'string3': 'Hello',
 'string4': 'Hello',
 'string5': 'Hello',
 'string6': 'Hello',
 'string7': 'Hello',
 'string8': 'Hello',
 'string9': 'Hello'}

Tôi đã nói điều này hơi khó kiểm tra, nhưng thực sự cách tốt nhất để liên kết một giá trị này với một giá trị khác là một từ điển. Đó là những gì nó được thiết kế cho!


62

Đó thực sự là một ý tưởng tồi, nhưng ...

for x in range(0, 9):
    globals()['string%s' % x] = 'Hello'

và sau đó là ví dụ:

print(string3)

sẽ cung cấp cho bạn:

Hello

Tuy nhiên đây là thực tế xấu. Bạn nên sử dụng từ điển hoặc danh sách thay thế, như những người khác đề xuất. Trừ khi, tất nhiên, bạn thực sự muốn biết làm thế nào để làm điều đó, nhưng không muốn sử dụng nó.


2
Bạn có thể giải thích tại sao đây là một ý tưởng tồi?
ajdigregorio

6
@painedcones: Trước tiên, nên có một cách để làm điều đó , và sử dụng từ điển đơn giản là tự nhiên hơn. Thay vào đó, sử dụng từ điển toàn cầu là một ý tưởng tồi, bởi vì nó cũng "ngầm" tạo ra các biến toàn cục hoặc sửa đổi chúng. Vì cả cài đặt và sửa đổi các biến theo cách này đều yêu cầu ký hiệu từ điển, không có lý do để sử dụng globals()thay vì một số đơn giản dict.
Tadeck

Có một vài tình huống khi bạn cần tạo ra một loạt các biến, x1, x2, x3, v.v. Nhưng trong hầu hết các tình huống, sử dụng từ điển thực sự là điều thích hợp nhất để làm.
DevilApple227

20

Một cách bạn có thể làm điều này là với exec(). Ví dụ:

for k in range(5):
    exec(f'cat_{k} = k*2')
>>> print(cat_0)
0
>>> print(cat_1)
2
>>> print(cat_2)
4
>>> print(cat_3)
6
>>> print(cat_4)
8

Ở đây tôi tận dụng định dạng chuỗi f tiện dụng trong Python 3.6+


4
Hãy nhớ execmột cái gì đó, ma thuật đen, tấn công các lỗ hổng, những thứ tồi tệ, nhưng nó trả lời câu hỏi như đã hỏi.
psaxton

18

Nó chỉ đơn giản là vô nghĩa để tạo ra các tên biến khác nhau. Tại sao?

  • Chúng không cần thiết: Bạn có thể lưu trữ mọi thứ trong danh sách, từ điển, v.v.
  • Chúng khó tạo: Bạn phải sử dụng exechoặcglobals()
  • Bạn không thể sử dụng chúng: Làm thế nào để bạn viết mã sử dụng các biến này? Bạn phải sử dụng exec/globals()lại

Sử dụng một danh sách dễ dàng hơn nhiều:

# 8 strings: `Hello String 0, .. ,Hello String 8`
strings = ["Hello String %d" % x for x in range(9)]
for string in strings: # you can loop over them
    print string
print string[6] # or pick any of them

Cảm ơn bạn!! Tôi cần chọn biểu mẫu trong số từ điển hoặc danh sách khung dữ liệu. Và vì tôi cần sắp xếp lại khung dữ liệu dựa trên một giá trị nhất định trên khung dữ liệu, tôi không thể sử dụng mẫu từ điển. Vâng, bạn đúng! Trong một số trường hợp, việc tạo ra các tên biến là vô nghĩa!
Doo Hyun Shin

9

Đừng làm điều này sử dụng một từ điển

import sys
this = sys.modules[__name__] # this is now your current namespace
for x in range(0,9):
    setattr(this, 'string%s' % x, 'Hello')

print string0
print string1
print string2
print string3
print string4
print string5
print string6
print string7
print string8

không làm điều này sử dụng một lệnh

globalals () có rủi ro vì nó cung cấp cho bạn những gì không gian tên hiện đang trỏ đến nhưng điều này có thể thay đổi và vì vậy sửa đổi lợi nhuận từ globalals () không phải là một ý tưởng hay


8
for x in range(9):
    exec("string" + str(x) + " = 'hello'")

Điều này nên làm việc.


3

Tôi sẽ sử dụng một danh sách:

string = []
for i in range(0, 9):
  string.append("Hello")

Bằng cách này, bạn sẽ có 9 "Xin chào" và bạn có thể nhận chúng riêng lẻ như thế này:

string[x]

Nơi nào xsẽ xác định "Xin chào" bạn muốn.

Vì vậy, print(string[1])sẽ in Hello.


1
Không giống như một số ngôn ngữ, bạn không thể gán cho các thành phần trong danh sách Python chưa tồn tại (bạn sẽ gặp lỗi "danh sách chỉ định danh sách ngoài phạm vi"). Bạn có thể muốn sử dụng string.append("Hello")thay thế.
Greg Hewgill

1
Tôi nên biết điều đó, cảm ơn bạn đã nhắc nhở tôi. Nó là cố định.
Lledargo

Quyền của bạn, tôi đã nghĩ đến việc thêm vào cuối chuỗi, không thêm vào một mảng. Tôi xin lỗi mọi người.
Lledargo

Về mặt giáo dục, 'bạn sẽ có 9 "Xin chào"' nên là 'bạn sẽ có 1 "Xin chào" 9 lần'. Đó là cùng một chuỗi lặp lại, không phải chín chuỗi khác nhau.
Duncan

2

Tôi nghĩ rằng thách thức ở đây không phải là kêu gọi toàn cầu ()

Cá nhân tôi sẽ xác định một danh sách cho các biến (động) của bạn sẽ được giữ và sau đó nối vào nó trong vòng lặp for. Sau đó sử dụng một vòng lặp for riêng biệt để xem từng mục hoặc thậm chí thực hiện các hoạt động khác.

Dưới đây là một ví dụ - tôi có một số thiết bị chuyển mạch mạng (từ 2 đến 8) tại nhiều BRanches khác nhau. Bây giờ tôi cần đảm bảo rằng tôi có một cách để xác định có bao nhiêu công tắc có sẵn (hoặc còn sống - kiểm tra ping) tại bất kỳ chi nhánh nào và sau đó thực hiện một số thao tác trên chúng.

Đây là mã của tôi:

import requests
import sys

def switch_name(branchNum):
    # s is an empty list to start with
    s = []
    #this FOR loop is purely for creating and storing the dynamic variable names in s
    for x in range(1,8,+1):
        s.append("BR" + str(branchNum) + "SW0" + str(x))

    #this FOR loop is used to read each of the switch in list s and perform operations on
    for i in s:
        print(i,"\n")
        # other operations can be executed here too for each switch (i) - like SSH in using paramiko and changing switch interface VLAN etc.


def main():  

    # for example's sake - hard coding the site code
    branchNum= "123"
    switch_name(branchNum)


if __name__ == '__main__':
    main()

Đầu ra là:

BR123SW01

BR123SW02

BR123SW03

BR123SW04

BR123SW05

BR123SW06

BR123SW07


2

Sử dụng từ điển phải là cách đúng để giữ các biến và giá trị liên quan và bạn có thể sử dụng từ này:

dict_ = {}
for i in range(9):
     dict_['string%s' % i]  = 'Hello'

Nhưng nếu bạn muốn thêm các biến vào các biến cục bộ, bạn có thể sử dụng:

for i in range(9):
     exec('string%s = Hello' % i)

Và ví dụ: nếu bạn muốn gán giá trị 0 đến 8 cho chúng, bạn có thể sử dụng:

for i in range(9):
     exec('string%s = %s' % (i,i))

0

Từ điển có thể chứa các giá trị và giá trị có thể được thêm bằng cách sử dụng phương thức update (). Bạn muốn hệ thống của bạn tạo các biến, vì vậy bạn nên biết nơi để giữ.

variables = {}
break_condition= True # Dont forget to add break condition to while loop if you dont want your system to go crazy.
name = variable
i = 0 
name = name + str(i) #this will be your variable name.
while True:
    value = 10 #value to assign
    variables.update(
                  {name:value})
    if break_condition == True:
        break
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.