如何解决没有反向功能但没有循环的反向阵列 first for循环在python中自动增加其变量下一个列表不是数组最后在一起
因此,我尝试不使用反向函数而从.txt文件中反向数组。这就是我所拥有的。
numbers = read() #creates numbers array out of the txt file
numbersrev = numbers #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
k = 0
for k in range(8):
numbersrev[k] = numbers[i]
print ("The ",i," element of numbers is the ",k," element of numbersrev")
i -= 1
k += 1
print(numbersrev)
这是我在vscode上调试后得到的:
[2,4,9,11,8,3,2,5,10]
Array length of numbers: 9
The 8 element of numbers is the 0 element of numbersrev
The 7 element of numbers is the 1 element of numbersrev
The 6 element of numbers is the 2 element of numbersrev
The 5 element of numbers is the 3 element of numbersrev
The 4 element of numbers is the 4 element of numbersrev
The 3 element of numbers is the 5 element of numbersrev
The 2 element of numbers is the 6 element of numbersrev
The 1 element of numbers is the 7 element of numbersrev
[10,10]
最上面的数组是原始数组,最下面的数组是假定的反转数组
我无法终生发现为什么它会在中途停止更改numbersrev数组。有人知道原因可能是什么吗?
解决方法
好吧,几件事...
first 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
和numbersrev
您应该要做的是numbersrev = []
然后在您的for循环中,只需将其附加到numbersrev而不是分配。
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 "," element of numbersrev")
i -= 1
print(numbersrev)
,
xmlns:th="https://www.thymeleaf.org"
将numbersrev = numbers
设置为指向与numbersrev
相同的列表,这意味着当您修改numbers
或numbers
时,您将同时修改另一个。同时。要制作该对象的实际副本,您需要调用numbersrev
。另外,@ sahasrara62的评论正确,您需要调用numbersrev = numbers.copy()
而不是for k in range(numLength)
您在这里所做的是,在此行中将反向数组分配为普通数组:
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,10]
numbers[2] = numbers[7] # [10,10]
numbers[3] = numbers[6] # [10,10]
numbers[4] = numbers[5] # [10,10]
numbers[5] = numbers[4] # [10,10]
numbers[6] = numbers[3] # [10,10]
numbers[7] = numbers[2] # [10,10]
numbers[8] = numbers[1] # [10,10]
numbers[9] = numbers[0] # [10,10]
...
如果您这样分配变量:
numLength = len(numbers) #measures the length of the array
numbersrev = [0]*numLength #blank array for reverse
由于反向列表不再指向正常列表,您将获得正确的答案。
,您面临的问题是因为这条线
numbersrev = numbers #blank array for reverse
在这一行中,您没有创建空数组,而是将numbers
数组的引用保存在名为numbersrev
的新变量中。这意味着当您在数组numbersrev
中进行操作时,您还将同时更改numbers
的值。为避免此类问题,您有两种选择:
复制包含切片的数组
通过这种方式,您将复制数组的值,而不是数组的引用。这意味着您对新阵列所做的更改不会更改原始阵列。
numbersrev = numbers[:]
创建一个空数组,并使用append代替赋值
此更改与您所做的更改有些不同,但是基本上没有创建数组的副本,而是创建了一个新的数组,该数组将填充到for循环中,例如:
numbers.rev = []
...
for k in range(8):
numbersrev.append(numbers[i])
因此,使用第一个选项并更改k索引中的某些内容,我们将获得如下代码:
numbers = [2,11,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 "," element of numbersrev")
i -= 1
print(numbersrev)
希望这可以帮助您解决问题,就像可以通过多种方式解决此问题的注释:切片(numbers[::-1]
,列表理解和其他一些方式一样。所有方法都是有效的,以防万一您想探索更多。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。