คุณสร้างชื่อตัวแปรที่แตกต่างกันอย่างไรในขณะที่อยู่ในวง [ซ้ำ]


125

เพื่อวัตถุประสงค์ตัวอย่าง ...

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

ดังนั้นฉันจึงลงท้ายด้วย string1, string2, string3 ... ทั้งหมดเท่ากับ "สวัสดี"


34
คำตอบคือคุณไม่ต้องการทำสิ่งนี้ ใช้รายการแทน
Sven Marnach

2
หากนี่คือที่ที่คุณต้องการใช้คุณสามารถx = ["Hello" * 9]เข้าถึงได้โดยx[0], x[1] ...หากคุณต้องการใช้ในลักษณะอื่นฉันคิดว่าคุณจะต้องให้ข้อมูลพื้นฐานเพิ่มเติมแก่เรา
James Khoury

3
หากฉันมีอำนาจเหนือภาษาการใช้ตัวเลขในชื่อตัวแปรจะให้SyntaxError: Use a data structure.;-)
Jochen Ritzel

1
และอย่าลืม string0;)
wim

10
@ James Khoury: ไม่ถูกต้องนัก ซึ่งจะลงเอยด้วยxการเป็นรายการที่มีองค์ประกอบเดียว - สตริง "HelloHelloHelloHelloHelloHelloHelloHelloHello" x = ["Hello"] * 9ฉันคิดว่าคุณหมายถึง

คำตอบ:


164

แน่ใจว่าคุณทำได้ เรียกว่าพจนานุกรม :

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 แทนนั้นเป็นความคิดที่ไม่ดีเพราะมัน "โดยปริยาย" จะสร้างตัวแปรส่วนกลางหรือแก้ไขตัวแปร เนื่องจากทั้งสองการตั้งค่าและการปรับเปลี่ยนตัวแปรด้วยวิธีนี้ต้องใช้สัญกรณ์พจนานุกรมมีเหตุผลที่จะไม่ใช้แทนการบางอย่างง่ายglobals() dict
Tadeck

มีบางสถานการณ์ที่คุณต้องสร้างตัวแปรจำนวนมาก 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")แทน
Greg Hewgill

1
ฉันควรจะรู้แล้วขอบคุณที่เตือนฉัน ได้รับการแก้ไขแล้ว
Lledargo

ถูกต้องฉันคิดว่าจะเพิ่มต่อท้ายสตริงไม่ใช่เพิ่มในอาร์เรย์ ฉันขอโทษทุกคน
Lledargo

'คุณจะมี 9 "สวัสดี" ควรจะเป็น "คุณจะมี 1" สวัสดี "9 ครั้ง" มันเป็นสตริงเดียวกันซ้ำไม่ใช่เก้าสตริงที่แตกต่างกัน
Duncan

2

ฉันคิดว่าความท้าทายที่นี่ไม่ใช่การเรียกร้องให้ทั่วโลก ()

ฉันจะกำหนดรายการสำหรับตัวแปร (ไดนามิก) ของคุณเป็นการส่วนตัวที่จะเก็บไว้จากนั้นต่อท้ายภายใน for loop จากนั้นใช้การแยกสำหรับลูปเพื่อดูแต่ละรายการหรือแม้แต่ดำเนินการอื่น ๆ

นี่คือตัวอย่าง - ฉันมีสวิตช์เครือข่ายจำนวนหนึ่ง (พูดระหว่าง 2 ถึง 8) ที่ BRanches ต่างๆ ตอนนี้ฉันต้องแน่ใจว่าฉันมีวิธีกำหนดจำนวนสวิตช์ที่พร้อมใช้งาน (หรือการทดสอบ 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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.