意图:在变量集合中,如果任何变量恰好是一个字符串,则拆分为“;”并使其成为一个列表。我尝试使用以下代码,但它无法正常工作。
我期待l2为[“3”,“4”],但它仍然是“3; 4”
请查看它并请详细说明如何循环列表变量并将其替换为:
>>> l1 = ["1" ,"2"]
>>> l2 = "3;4"
>>> l3 = ["5", "6"]
>>>
>>> for x in [l1, l2, l3]:
print("Working on: {}".format(x))
if isinstance(x, basestring):
x = x.split(";")
print("New x: {}".format(x))
else:
print("Its same")
Working on: ['1', '2']
Its same
Working on: 3;4
New x: ['3', '4']
Working on: ['5', '6']
Its same
>>> l1, l2, l3
(['1', '2'], '3;4', ['5', '6'])
预期值:
>>> l1, l2, l3
(['1', '2'], ['3', '4'], ['5', '6'])
答案 0 :(得分:2)
Python中的字符串是不可变的 - 它们不能就地更改。因此:
x = x.split(";")
创建新对象(list
)并将其分配给名称x
,但不会更改列表被迭代。但是,在这种情况下,即使您更改了列表,l2
仍会引用原始的str
对象。
在Python中,名称是对象的引用 - [l1, l2, l3]
只是表示第一个索引引用当前由名称l1
引用的对象的列表,依此类推。
你可以改为使用这个功能:
def splitter(x):
print("Working on: {}".format(x))
if isinstance(x, basestring):
x = x.split(";")
print("New x: {}".format(x))
else:
print("It's the same")
return x
然后你可以这样做:
l1 = splitter(l1)
l2 = splitter(l2)
l3 = splitter(l3)
并获得您想要的结果。
或者,将列表解包回名称(这里使用列表解析):
l1, l2, l3 = [splitter(x) for x in [l1, l2, l3]]
(或者,很长一段路)
vals = [l1, l2, l3] # create list
for i, x in enumerate(vals): # iterate through list
vals[i] = splitter(x) # modify list
l1, l2, l3 = vals # unpack list
答案 1 :(得分:1)
这是因为当您使用for x in lists:
时,x
是列表项的副本,当您将列表分配回x
时,您将其分配给{{1}而不是原始列表。相反,你可以这样做:
x