Як ви створюєте різні імена змінних, перебуваючи в циклі? [дублікат]


125

Наприклад, цілі ...

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

Тож я закінчую рядок1, string2, string3 ... все дорівнює "Привіт"


34
Відповідь полягає в тому, що ви цього не хочете робити. Використовуйте замість цього список.
Свен Марнах

2
Якщо тут ви хочете використовувати його, ви можете мати x = ["Hello" * 9]доступ до нього, x[0], x[1] ...якщо ви хочете використовувати його по-іншому, я думаю, вам доведеться дати нам ще декілька кодів.
Джеймс Хоурі

3
Якщо я коли-небудь SyntaxError: Use a data structure.
матиму

1
і не забудьте свою string0;)
wim

10
@James Khoury: Це не зовсім правильно. Зрештою x, це список, що містить один елемент - рядок "HelloHelloHelloHelloHelloHelloHelloHelloHello". Я думаю, ти мав на увазі x = ["Hello"] * 9.

Відповіді:


162

Звичайно, ви можете; це називається словником :

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

Я сказав це дещо мовою в перевірці, але насправді найкращий спосіб пов’язати одне значення з іншим значенням - це словник. Саме для цього він і був розроблений!


62

Це дійсно погана ідея, але ...

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

а потім, наприклад:

print(string3)

дасть вам:

Hello

Однак це погана практика. Натомість слід використовувати словники чи списки, як це пропонують інші. Якщо, звичайно, ви дуже хотіли знати, як це зробити, але не хотіли ним користуватися.


2
Чи можете ви детальніше пояснити, чому це погана ідея?
ajdigregorio

6
@paintedcones: По-перше, це повинен бути один із способів , і використання простих словників є більш природним. Використання словника глобалів натомість є поганою ідеєю, оскільки воно також "неявно" створює глобальні змінні або модифікує їх. Оскільки налаштування та модифікація змінних таким чином вимагає позначення словника, немає ніяких причин використовувати globals()замість деяких простих dict.
Тадек

Є кілька ситуацій, коли вам потрібно зробити купу змінних, x1, x2, x3 і т. Д. Але в більшості ситуацій використання словника справді є найбільш підходящою справою.
DevilApple227

20

Один із способів зробити це - за допомогою exec(). Наприклад:

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

Тут я користуюся зручним форматуванням рядків f в Python 3.6+


5
Згадайте execщось щось, чорну магію, вразливості атаки, погані речі, але це відповідає на запитання.
psaxton

18

Створювати імена змінних змін просто безглуздо. Чому?

  • Вони непотрібні: ви можете зберігати все у списках, словниках тощо
  • Їх важко створити: Ви повинні використовувати execабоglobals()
  • Ви не можете їх використовувати: як ви пишете код, який використовує ці змінні? Вам доведеться exec/globals()знову використовувати

Використовувати список набагато простіше:

# 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

Дякую!! Мені потрібно було вибрати форму серед словника чи списку фреймів даних. А оскільки мені потрібно було перевпорядкувати кадр даних на основі певного значення на фреймі даних, я не міг використати форму словника. Так, ти маєш рацію! У деяких випадках створювати імена змінних справді безглуздо!
Doo Hyun Shin

9

Не робіть цього за допомогою словника

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

не роби це для використання диктату

globals () має ризик, оскільки він дає вам те, на що вказує на даний момент простір імен, але це може змінитися, і тому зміна повернення з globals () не є хорошою ідеєю



3

Я б використав список:

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

Таким чином, у вас буде 9 "Привіт", і ви можете отримати їх окремо так:

string[x]

Де можна xбуло б визначити, яке "Привіт" ви хочете.

Отже, print(string[1])друкували б Hello.


1
На відміну від деяких мов, ви не можете призначити елементи в списку Python, які ще не існують (ви отримаєте помилку "індекс призначення списку поза діапазоном"). Ви можете використовувати string.append("Hello")замість цього.
Грег Хьюгілл

1
Я мав це знати, дякую, що нагадали мені. Це зафіксовано.
Леледарго

Ваше право, я думав додати до кінця рядка, а не додати до масиву. Вибачте всі.
Леледарго

Педантично "у вас було б 9" Привіт ", має бути" у вас буде 1 "Привіт" 9 разів ". Це повторюється той самий рядок, а не дев'ять рядків різниці.
Дункан

2

Я думаю, що тут завдання - не закликати до глобальної ()

Я б особисто визначив список для ваших (динамічних) змінних, який повинен міститись, а потім додав би його до циклу for. Потім використовуйте окремий цикл, щоб переглянути кожен запис або навіть виконати інші операції.

Ось приклад - у мене є декілька мережевих комутаторів (скажімо, між 2 та 8) на різних брендах. Тепер мені потрібно переконатися, що я маю змогу визначити, скільки комутаторів доступно (або живим - тестуванням ping) у будь-якій галузі, а потім виконати деякі операції над ними.

Ось мій код:

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

Вихід:

BR123SW01

BR123SW02

BR123SW03

BR123SW04

BR123SW05

BR123SW06

BR123SW07


2

Використання словників має бути правильним способом збереження змінних та пов’язаних значень, і ви можете використовувати це:

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

Але якщо ви хочете додати змінні до локальних змінних, ви можете використовувати:

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

Наприклад, якщо ви хочете призначити їм значення від 0 до 8, ви можете використовувати:

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

0

Словник може містити значення, а значення можуть бути додані за допомогою методу update (). Ви хочете, щоб ваша система створювала змінні, тому ви повинні знати, де їх тримати.

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.