4 回答
TA贡献1802条经验 获得超10个赞
好吧,有几件事...
首先,for 循环在 python 中自动增加它们的变量。
所以:
for k in range(8):
...
i -= 1
k += 1
应该:
for k in range(8):
...
i -= 1
无需手动增加 k。
接下来的列表不是数组。
python 中的列表与 C 等语言中的数组有很大不同。列表是可变的,并且默认情况下通过引用传递。所以当你尝试创建一个空数组时:
numbersrev = numbers #blank array for reverse
您实际上numbers是从AND引用相同的“列表”numbersrev
你应该做的是numbersrev = []
然后在 for 循环中,只需附加到 numberrev 而不是分配。
for k in range(numLength):
numbersrev.append(numbers[i])
print ("The ", i," element of numbers is the ", k," element of numbersrev")
i -= 1
最后
你可以/应该在 for 循环中引用数字的长度而不是硬编码的值,但是你如何拥有它仍然有效(假设你只得到8个数字)
for k in range(numLength):
...
全部一起
numbers = read() #creates numbers array out of the txt file
numbersrev = [] #blank array for reverse
numLength = len(numbers) #measures the length of the array
print(numbers)
print("Array length of numbers: ", numLength)
i = numLength
i = i-1 #since the array starts at 0 instead of 1
for k in range(numLength):
numbersrev.append(numbers[i])
print ("The ", i," element of numbers is the ", k," element of numbersrev")
i -= 1
print(numbersrev)
TA贡献1830条经验 获得超9个赞
您在这里所做的就是使用以下行将反转数组指定为普通数组:
numbersrev = numbers #blank array for reverse
您实际上对该循环所做的事情是这样的:
numbers[0] = numbers[9] # [10, 2, 3, 4, 5, 6, 7, 8, 9, 10]
numbers[1] = numbers[8] # [10, 9, 3, 4, 5, 6, 7, 8, 9, 10]
numbers[2] = numbers[7] # [10, 9, 8, 4, 5, 6, 7, 8, 9, 10]
numbers[3] = numbers[6] # [10, 9, 8, 7, 5, 6, 7, 8, 9, 10]
numbers[4] = numbers[5] # [10, 9, 8, 7, 6, 6, 7, 8, 9, 10]
numbers[5] = numbers[4] # [10, 9, 8, 7, 6, 6, 7, 8, 9, 10]
numbers[6] = numbers[3] # [10, 9, 8, 7, 6, 6, 7, 8, 9, 10]
numbers[7] = numbers[2] # [10, 9, 8, 7, 6, 6, 7, 8, 9, 10]
numbers[8] = numbers[1] # [10, 9, 8, 7, 6, 6, 7, 8, 9, 10]
numbers[9] = numbers[0] # [10, 9, 8, 7, 6, 6, 7, 8, 9, 10]
...
如果您像这样分配变量:
numLength = len(numbers) #measures the length of the array
numbersrev = [0]*numLength #blank array for reverse
您将得到正确的答案,因为反向列表不再指向正常列表。
TA贡献1840条经验 获得超5个赞
你面临的问题是因为这条线
numbersrev = numbers #blank array for reverse
在这一行中,您不是创建空数组,而是将numbers数组的引用保存在名为 的新变量中numbersrev。这意味着当您在数组中进行操作时,numbersrev您也会更改 的值numbers。为了避免此类问题,您有两种选择:
使用切片制作数组的副本
通过这种方式,您可以复制数组的值,而不是数组的引用。这意味着您对新数组所做的更改不会更改原始数组。
numbersrev = numbers[:]
创建一个空数组并使用追加而不是赋值
此更改与您所做的略有不同,但基本上您不是创建数组的副本,而是创建一个新数组,该数组将填充到 for 循环中,如下所示:
numbers.rev = []
...
for k in range(8):
numbersrev.append(numbers[i])
因此,使用第一个选项并更改 k 索引中的一些内容,我们有这样的代码:
numbers = [2, 4, 9, 11, 8, 3, 2, 5, 10] # you can change for read
numbersrev = numbers[:] #copy array elements
numLength = len(numbers) #array length
print(numbers)
print("Array length of numbers: ", numLength)
i = numLength - 1
# you don't need to initialize k because it's initialized and incremented with range in the loop
for k in range(numLength):
numbersrev[k] = numbers[i]
print ("The ", i," element of numbers is the ", k," element of numbersrev")
i -= 1
print(numbersrev)
希望这能帮助你解决问题,就像注释一样,你可以通过多种方式解决这个问题:切片(numbers[::-1])、列表理解和其他一些。所有方法都是有效的,以防万一您想探索更多。
TA贡献1793条经验 获得超6个赞
numbersrev = numbers
设置numbersrev
为指向与 相同的列表numbers
,这意味着当您修改numbers
或numbersrev
同时修改另一个列表时。要制作对象的实际副本,您需要调用numbersrev = numbers.copy()
. 另外,@sahasrara62的评论是正确的,你需要打电话for k in range(numLength)
而不是for k in range(8)
添加回答
举报