Bagaimana Anda membuat nama variabel yang berbeda saat berada dalam loop? [duplikat]

125

Untuk tujuan contoh ...

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

Jadi saya berakhir dengan string1, string2, string3 ... semua sama dengan "Halo"

Takkun
sumber
34
Jawabannya adalah Anda tidak ingin melakukan ini. Gunakan daftar sebagai gantinya.
Sven Marnach
2
Jika ini adalah tempat Anda ingin menggunakannya, Anda dapat x = ["Hello" * 9]mengaksesnya dengan. x[0], x[1] ...Jika Anda ingin menggunakannya dengan cara yang berbeda, saya pikir Anda harus memberi kami lebih banyak latar belakang kode.
James Khoury
3
Jika saya pernah memiliki kekuatan atas suatu bahasa maka menggunakan angka dalam nama variabel akan menghasilkan SyntaxError: Use a data structure.;-)
Jochen Ritzel
1
dan jangan lupa string0 Anda;)
wim
10
@ James Khoury: Itu kurang tepat. Itu akan berakhir dengan xmenjadi daftar yang berisi satu elemen - string "HelloHelloHelloHelloHelloHelloHelloHelloHello". Saya pikir yang Anda maksud x = ["Hello"] * 9.

Jawaban:

162

Tentu kamu bisa; itu disebut kamus :

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'}

Saya mengatakan ini agak sulit, tetapi sebenarnya cara terbaik untuk mengasosiasikan satu nilai dengan nilai lain adalah kamus. Untuk itulah ia dirancang!

serigala
sumber
62

Ini benar-benar ide yang buruk, tapi ...

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

lalu misalnya:

print(string3)

akan memberimu:

Hello

Namun ini adalah praktik yang buruk. Anda sebaiknya menggunakan kamus atau daftar, seperti yang diusulkan orang lain. Kecuali, tentu saja, Anda benar-benar ingin tahu bagaimana melakukannya, tetapi tidak ingin menggunakannya.

Tadeck
sumber
2
Bisakah Anda menjelaskan mengapa ini adalah ide yang buruk?
ajdigregorio
6
@paintedcones: Pertama, harus ada satu cara untuk melakukannya , dan menggunakan kamus sederhana lebih alami. Menggunakan kamus global sebagai gantinya adalah ide yang buruk, karena itu juga "secara implisit" membuat variabel global atau memodifikasinya. Karena pengaturan dan pengubahan variabel dengan cara ini membutuhkan notasi kamus, tidak ada alasan untuk menggunakan globals()selain beberapa yang sederhana dict.
Tadeck
Ada beberapa situasi ketika Anda benar-benar perlu membuat banyak variabel, x1, x2, x3, dll. Namun dalam kebanyakan situasi, menggunakan kamus adalah hal yang paling tepat untuk dilakukan.
DevilApple227
20

Salah satu cara untuk melakukannya adalah dengan exec(). Sebagai contoh:

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

Di sini saya memanfaatkan pemformatan string f yang praktis dengan Python 3.6+

Collin W.
sumber
5
Ingat execsesuatu, sihir hitam, kerentanan serangan, hal-hal buruk, tetapi itu menjawab pertanyaan seperti yang ditanyakan.
psaxton
18

Tidak ada gunanya membuat nama variabel variabel. Mengapa?

  • Mereka tidak diperlukan: Anda dapat menyimpan semuanya dalam daftar, kamus, dan sebagainya
  • Mereka sulit dibuat: Anda harus menggunakan execatauglobals()
  • Anda tidak dapat menggunakannya: Bagaimana Anda menulis kode yang menggunakan variabel ini? Anda harus menggunakan exec/globals()lagi

Menggunakan daftar jauh lebih mudah:

# 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
Jochen Ritzel
sumber
Terima kasih!! Saya harus memilih formulir di antara kamus atau daftar kerangka data. Dan karena saya perlu menyusun ulang kerangka data berdasarkan nilai tertentu pada kerangka data, saya tidak dapat menggunakan bentuk kamus. Ya, Anda benar! Dalam beberapa kasus, tidak ada gunanya membuat nama variabel!
Doo Hyun Shin
9

Jangan lakukan ini menggunakan kamus

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

jangan lakukan ini gunakan dikt

globals () memiliki risiko karena memberi Anda apa yang saat ini diarahkan oleh namespace tetapi ini dapat berubah sehingga mengubah pengembalian dari global () bukanlah ide yang baik

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

Ini seharusnya berhasil.

Abhishek Rai
sumber
3

Saya akan menggunakan daftar:

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

Dengan cara ini, Anda akan mendapatkan 9 kata "Halo" dan Anda bisa mendapatkannya satu per satu seperti ini:

string[x]

Di mana Anda xdapat mengidentifikasi kata "Halo" yang Anda inginkan.

Jadi, print(string[1])mau mencetak Hello.

Lledargo
sumber
1
Tidak seperti beberapa bahasa, Anda tidak dapat menetapkan elemen dalam daftar Python yang belum ada (Anda akan mendapatkan kesalahan "daftar tugas indeks di luar jangkauan"). Anda mungkin ingin menggunakan string.append("Hello")sebagai gantinya.
Greg Hewgill
1
Saya seharusnya tahu itu, terima kasih telah mengingatkan saya. Sudah diperbaiki.
Lledargo
Hak Anda, saya sedang berpikir untuk menambahkan ke ujung string, bukan menambahkan ke array. Saya minta maaf semuanya.
Lledargo
Pedantically 'you would have 9 "Hello"' should be 'you would have 1 "Hello" 9 times'. Itu adalah string yang sama yang berulang, bukan sembilan string yang berbeda.
Duncan
2

Saya pikir tantangannya di sini bukanlah untuk memanggil global ()

Saya pribadi akan menentukan daftar untuk variabel (dinamis) Anda yang akan disimpan dan kemudian menambahkannya ke dalam for loop. Kemudian gunakan for loop terpisah untuk melihat setiap entri atau bahkan menjalankan operasi lain.

Berikut ini contohnya - Saya memiliki sejumlah switch jaringan (misalnya antara 2 dan 8) di berbagai BRanches. Sekarang saya perlu memastikan bahwa saya memiliki cara untuk menentukan berapa banyak sakelar yang tersedia (atau tes ping hidup) di cabang tertentu dan kemudian melakukan beberapa operasi padanya.

Ini kode saya:

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()

Outputnya adalah:

BR123SW01

BR123SW02

BR123SW03

BR123SW04

BR123SW05

BR123SW06

BR123SW07

Cumar Chan
sumber
2

Menggunakan kamus harus menjadi cara yang tepat untuk menyimpan variabel dan nilai terkait, dan Anda dapat menggunakan ini:

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

Tetapi jika Anda ingin menambahkan variabel ke variabel lokal, Anda dapat menggunakan:

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

Dan misalnya jika Anda ingin menetapkan nilai 0 hingga 8, Anda dapat menggunakan:

for i in range(9):
     exec('string%s = %s' % (i,i))
Ashkan Mirzaee
sumber
0

Kamus dapat berisi nilai dan nilai dapat ditambahkan dengan menggunakan metode update (). Anda ingin sistem Anda membuat variabel, jadi Anda harus tahu di mana harus menyimpannya.

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
Ogibalboa
sumber