如何在python中使用列表中的切片运算符避免for循环中的副作用?
这是从链接中引用的:- 为了避免这些副作用,最好使用切片操作符处理副本,如下一个示例所示: 输出为:如何在python中使用列表中的切片运算符避免for循环中的副作用?,python,list,python-2.7,slice,Python,List,Python 2.7,Slice,这是从链接中引用的:- 为了避免这些副作用,最好使用切片操作符处理副本,如下一个示例所示: 输出为: ['red', 'black'] 我的问题是:语句colors[:]是否复制了颜色列表,并且for循环是否在副本而不是原始列表上工作?如果是这样,那么如何将[“balck”]附加到原始颜色列表中?colors[:]复制原始列表并对其进行迭代,但colors保留原始列表。以下代码将等效: copy = colours.copy() for i in copy: if i == "red"
['red', 'black']
我的问题是:语句
colors[:]
是否复制了颜色列表,并且for循环是否在副本而不是原始列表上工作?如果是这样,那么如何将[“balck”]
附加到原始颜色列表中?colors[:]
复制原始列表并对其进行迭代,但colors
保留原始列表。以下代码将等效:
copy = colours.copy()
for i in copy:
if i == "red":
colours.append("black") # append is O(1)
if i == "black":
colours.append("white")
colors[:]
复制原始列表并对其进行迭代,但colors
保留原始列表。以下代码将等效:
copy = colours.copy()
for i in copy:
if i == "red":
colours.append("black") # append is O(1)
if i == "black":
colours.append("white")
语句
颜色[:]
是否复制了颜色列表:是
并且for循环在副本上而不是在原始列表上工作?是的,但请注意“在上工作”的含义。变量i
从列表colors
的副本中获取其值。但是,colors+=[“black”]
行中对colors
的引用是指原始列表。这正是代码想要的,所以它是有效的
如果是这样,那么[“黑色”]是如何附加到原始颜色列表中的?这是因为附加的行是指原始列表,而不是列表的副本。语句
颜色[:]
是否复制了颜色列表:是
并且for循环在副本上而不是在原始列表上工作?是的,但请注意“在上工作”的含义。变量i
从列表colors
的副本中获取其值。但是,colors+=[“black”]
行中对colors
的引用是指原始列表。这正是代码想要的,所以它是有效的
如果是这样,那么[“黑色”]是如何附加到原始颜色列表中的?这是因为进行附加的行是指原始列表,而不是列表的副本。这是您在提供的: 如果在列表上循环,最好避免在循环体中更改列表。为了给你一个例子,看看会发生什么,请看下面的例子: “打印颜色”将打印什么 为了避免这些副作用,最好使用切片操作符处理副本,如下一个示例所示: 我们仍然可以做一些我们不应该做的事情。我们更改了“颜色”列表,但我们的更改对循环没有任何影响。要循环的元素在迭代过程中保持不变 因此: 现在没有副本:
colours = ["red"]
for i in colours:
if i == "red":
colours += ["black"] # black gets added, colours -> ["red", "black"]
if i == "black": # now because of ^^, white gets added.
colours += ["white"]
print(colours) # -> ['red', 'black', 'white']
现在更糟糕的情况是:
colours = ["red"]
for i in colours:
if i == "red":
colours += ["red"] # red gets add, colours = ["red", "red"]
# 2nd iteration, red gets added, colours -> colours = ["red", "red", "red"]
# infinite loop....
if i == "black":
colours += ["white"]
print(colours)
您所做的与示例试图展示的完全不同,它试图避免将元素添加到您正在迭代的列表中,因此您只计算原始列表中的元素,而不是新添加的元素。您正在尝试创建一个新列表:
colours = ["red"]
new = colours[:] # assign new list/copy to a name.
for i in colours:
if i == "red":
new += ["red"] # add to new list
if i == "black":
new += ["white"]
print(colours)
您还应该附加
而不是+=
:
colours = ["red"]
new = colours[:]
for i in colours:
if i == "red":
new.append("red")
if i == "black":
new.append("white")
print(colours)
这是您在提供的中引用的代码: 如果在列表上循环,最好避免在循环体中更改列表。为了给你一个例子,看看会发生什么,请看下面的例子: “打印颜色”将打印什么 为了避免这些副作用,最好使用切片操作符处理副本,如下一个示例所示: 我们仍然可以做一些我们不应该做的事情。我们更改了“颜色”列表,但我们的更改对循环没有任何影响。要循环的元素在迭代过程中保持不变 因此: 现在没有副本:
colours = ["red"]
for i in colours:
if i == "red":
colours += ["black"] # black gets added, colours -> ["red", "black"]
if i == "black": # now because of ^^, white gets added.
colours += ["white"]
print(colours) # -> ['red', 'black', 'white']
现在更糟糕的情况是:
colours = ["red"]
for i in colours:
if i == "red":
colours += ["red"] # red gets add, colours = ["red", "red"]
# 2nd iteration, red gets added, colours -> colours = ["red", "red", "red"]
# infinite loop....
if i == "black":
colours += ["white"]
print(colours)
您所做的与示例试图展示的完全不同,它试图避免将元素添加到您正在迭代的列表中,因此您只计算原始列表中的元素,而不是新添加的元素。您正在尝试创建一个新列表:
colours = ["red"]
new = colours[:] # assign new list/copy to a name.
for i in colours:
if i == "red":
new += ["red"] # add to new list
if i == "black":
new += ["white"]
print(colours)
您还应该附加
而不是+=
:
colours = ["red"]
new = colours[:]
for i in colours:
if i == "red":
new.append("red")
if i == "black":
new.append("white")
print(colours)
是,但您仍在添加到原始列表中。在循环和附加之前,请创建一个新副本。您应该添加完整的代码,因为它与您尝试执行的操作完全不同。是的,但您仍在添加到原始列表中。在循环并附加到之前,请创建一个新副本。您应该添加完整的代码,因为它与您尝试执行的操作完全不同。使用“附加”可添加到list@PadraicCunningham我只是逐字复制了原始代码,但是是的,已更改。您仍然需要迭代原始列表,以匹配要添加到list@PadraicCunningham我只是一字不差地复制了原始代码,但是是的,更改了。您仍然需要迭代原始列表以匹配代码的意图。因此,如果我编写
colors[:]+=[“black”]
然后它将附加到副本列表中,并且对原始列表没有任何影响?其次,副本可以更改吗?如果您要编写colors[:]+=[“black”]
,您将附加到一个新副本,而不是您正在迭代的副本。@dlpnrwbie96,不,您需要创建一个新列表,new=colors[:]
并附加到new@dlpnewbie96:是的,列表的新副本将被更改,但是,由于您没有将结果保存在任何地方,因此更改将丢失并且没有任何价值。更改的副本将不同于在“颜色[:]:”行中创建的副本,它是在同一行中创建、更改和丢失的。所以一份拷贝可以被修改,这有它的优点和缺点。存储for
行中的副本并用于le