Python 不带反转功能的反转阵列,但环路为';行不通

Python 不带反转功能的反转阵列,但环路为';行不通,python,loops,reverse,Python,Loops,Reverse,因此,我试图在不使用reverse函数的情况下从.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

因此,我试图在不使用reverse函数的情况下从.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]
数字数组长度:9
数字的8元素是numbersrev的0元素
数字的7个元素是数字的1个元素
数字的6个元素是数字的2个元素
数字的5个元素是数字的3个元素
数字的4个元素就是数字的4个元素
数字的3个元素是数字的5个元素
数字的2元素是数字的6元素Rev
数字的1元素是数字的7元素
[10, 5, 2, 3, 8, 3, 2, 5, 10]
顶部阵列是原始阵列,底部阵列是假定的反转阵列


我一辈子也弄不明白为什么它中途停止改变numbersrev数组。有人知道原因是什么吗?

numbersrev=numbers
设置
numbersrev
指向与
numbers
相同的列表,这意味着当您修改
numbers
numbersrev
时,您同时修改了另一个列表。要制作对象的实际副本,您需要调用
numbersrev=numbers.copy()
。另外,@sahasrara62的评论是正确的,您需要调用
来表示范围内的k(numLength)
而不是
来表示范围内的k(8)
您在这里所做的是使用以下行将反向数组指定为正常数组:

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
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)
你会得到正确的答案,因为反向列表不再指向正常列表。

好的,有几件事

首先,for循环在python中自动增加其变量。 因此:

应该是:

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个数字)

全部
你面临的问题是因为这条线

numbersrev = numbers #blank array for reverse
在这一行中,您不是在创建空数组,而是在名为
numbersrev
的新变量中保存
numbersrev
数组的引用。这意味着当您在数组
numbersrev
中进行操作时,您也在更改
numbers
的值。要避免此类问题,您有两种选择:

用切片复制阵列

通过这种方式,可以复制数组的值,而不是数组的引用。这意味着您对新阵列所做的更改不会更改原始阵列

numbersrev = numbers[:]
创建一个空数组并使用append而不是assignation

此更改与您所做的略有不同,但基本上不是创建数组的副本,而是创建一个新数组,该数组将填充到for循环中,类似于:

numbers.rev = []
...
for k in range(8):
    numbersrev.append(numbers[i])
因此,对于第一个选项,并更改k索引中的某些内容,我们有如下代码:

numLength = len(numbers) #measures the length of the array 
numbersrev = [0]*numLength #blank array for reverse
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)

希望这能帮助你解决这个问题,就像一张便条一样,你可以通过多种方式解决这个问题:切片(
数字[:-1]
),列表理解和其他一些方法。所有的方法都是有效的,以防你想探索更多。

范围内的k(8):
更改为
范围内的k(numLength):
注意
数字[::-1]
也可以用更少的工作量完成同样的工作。
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)