Python 交换变量与使用索引交换数组元素

Python 交换变量与使用索引交换数组元素,python,swap,Python,Swap,如果我初始化两个变量并“pythonically”交换它们,元素就会被交换 a, b = 1, 0 a, b = b, a >>> a 0 >>> b 1 但如果我尝试对以下代码使用相同的pythonic语法,数组将保持不变 >>> arr = [1, 0] >>> arr[0], arr[arr[0]] = arr[arr[0]], arr[0] >>> arr [1, 0] 为什么不交换数组的元素

如果我初始化两个变量并“pythonically”交换它们,元素就会被交换

a, b = 1, 0
a, b = b, a

>>> a
0
>>> b
1
但如果我尝试对以下代码使用相同的pythonic语法,数组将保持不变

>>> arr = [1, 0]
>>> arr[0], arr[arr[0]] = arr[arr[0]], arr[0]
>>> arr
[1, 0]
为什么不交换数组的元素


我经历过,但我仍然不清楚如何加载第二个例子(用索引交换数组的元素)。

如果考虑简化的赋值:

,你的问题会变得更加尖锐。
arr[0], arr[arr[0]] = 0, 1
这里实际上有两条赋值语句,按顺序执行:

arr[0] = 0      # arr: [0,0]
arr[arr[0]] = 1 # arr: [1,0], because arr[0] was 0

<> >第一项 < ARR >改变了两次,但第二项根本没有改变。

< P>如果考虑简化的赋值:

,你的问题变得更加尖锐。
arr[0], arr[arr[0]] = 0, 1
这里实际上有两条赋值语句,按顺序执行:

arr[0] = 0      # arr: [0,0]
arr[arr[0]] = 1 # arr: [1,0], because arr[0] was 0

arr
的第一项更改了两次,但第二项根本没有更改。

要确定何时调用
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

from collections.abc导入可变序列,Iterable
类PrintingMutable(MutableSequence):
def uu init uu(self,source:(可变序列,Iterable)=无):
尝试:
self.arr=列表(源)
除类型错误外:
self.arr=[]
定义报告(自我):
退货报告(自报)
def插入(自,索引:int,o)->无:
self.arr.insert(索引,o)#快速失败
插入时的self.on_(索引,o)
定义(self,i:(int,slice)):
val=self.arr[i]#创建不必要的名称以快速失败。
如果存在(i,切片):
对于范围内的idx(i.启动、i.停止、i.步骤,如果i.步骤1):
自我激励(idx)
其他:
自我介绍(一)
返回值
def uuu setitem uuuu(self,i:int,o)->无:
self.arr[i]=o
自组(一)
def u delitem(self,i:int)->无:#我想我不会用它。
del self.arr[i]
自我介绍(一)
定义长度(自)->int:
回程长度(自转角)
插件上的def(自身、idx、项目):
打印(f“在{idx}处插入项目{item}”)
self.print_statistics()
def on_get(自身,idx):
打印(f“在{idx}处获取项{self.arr[idx]}”)
self.print_statistics()
def on_集合(自身,idx):
打印(f“设置项{self.arr[idx]}位于{idx}”)
self.print_statistics()
del上的def(自身,idx):
打印(f“del item{self.arr[idx]}位于{idx}”)
self.print_statistics()
def打印统计(自我):
打印(自我)
并在Python控制台中玩一玩——您将看到Python评估您的问题的顺序。 添加注释以澄清步骤

a[0],a[1]=a[1],a[0]
在1获取项目0
[1, 0]
在0处获取项目1
[1, 0]
将项0设置为0
[0, 0]
将项目1设置为1
[0, 1]
通常情况下,您希望
\uuuu getitem\uuuuuuu
\uuuu setitem\uuuuuuuuu
以相同的顺序获取/分配值。对于这种情况-获取0,获取1,设置0,设置1

对于您的代码:

>>> from _63866011 import PrintingMutable
>>> a = PrintingMutable([1, 0])
>>> a[0], a[a[0]] = a[a[0]], a[0]
get item 1 at 0  # get a[0] = 1
[1, 0]
get item 0 at 1  # get a[a[0]] = 0
[1, 0]

get item 1 at 0
[1, 0]
set item 0 at 0
[0, 0]

get item 0 at 0
[0, 0]
set item 1 at 0
[1, 0]
获取1,获取2,设置1,设置2,以与上面相同的顺序

但使用列表项访问列表会弄乱索引


继续玩这个游戏,直到你知道赋值在
可变序列中是如何工作的

要确定何时调用
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu>和
,请尝试以下类:

from collections.abc导入可变序列,Iterable
类PrintingMutable(MutableSequence):
def uu init uu(self,source:(可变序列,Iterable)=无):
尝试:
self.arr=列表(源)
除类型错误外:
self.arr=[]
定义报告(自我):
退货报告(自报)
def插入(自,索引:int,o)->无:
self.arr.insert(索引,o)#快速失败
插入时的self.on_(索引,o)
定义(self,i:(int,slice)):
val=self.arr[i]#创建不必要的名称以快速失败。
如果存在(i,切片):
对于范围内的idx(i.启动、i.停止、i.步骤,如果i.步骤1):
自我激励(idx)
其他:
自我介绍(一)
返回值
def uuu setitem uuuu(self,i:int,o)->无:
self.arr[i]=o
自组(一)
def u delitem(self,i:int)->无:#我想我不会用它。
del self.arr[i]
自我介绍(一)
定义长度(自)->int:
回程长度(自转角)
插件上的def(自身、idx、项目):
打印(f“在{idx}处插入项目{item}”)
self.print_statistics()
def on_get(自身,idx):
打印(f“在{idx}处获取项{self.arr[idx]}”)
self.print_statistics()
def on_集合(自身,idx):
打印(f“设置项{self.arr[idx]}位于{idx}”)
self.print_statistics()
del上的def(自身,idx):
打印(f“del item{self.arr[idx]}位于{idx}”)
self.print_statistics()
def打印统计(自我):
打印(自我)
并在Python控制台中玩一玩——您将看到Python评估您的问题的顺序。 添加注释以澄清步骤

a[0],a[1]=a[1],a[0]
在1获取项目0
[1, 0]
在0处获取项目1
[1, 0]
将项0设置为0
[0, 0]
将项目1设置为1
[0, 1]
通常情况下,您希望
\uuuu getitem\uuuuuuu
\uuuu setitem\uuuuuuuuu
以相同的顺序获取/分配值。对于这种情况-获取0,获取1,设置0,设置1

对于您的代码:

>>> from _63866011 import PrintingMutable
>>> a = PrintingMutable([1, 0])
>>> a[0], a[a[0]] = a[a[0]], a[0]
get item 1 at 0  # get a[0] = 1
[1, 0]
get item 0 at 1  # get a[a[0]] = 0
[1, 0]

get item 1 at 0
[1, 0]
set item 0 at 0
[0, 0]

get item 0 at 0
[0, 0]
set item 1 at 0
[1, 0]
获取1,获取2,设置1,设置2,以与上面相同的顺序

但使用列表项访问列表会弄乱索引


继续玩这个,直到你知道赋值在
MutableSequence

中是如何工作的。当你可以做
arr[0],arr[1]=arr[1],arr[0]
的时候,为什么要尝试使用双索引呢?你不应该修改数组,并在这样的“pythonically”连接语句中使用修改后的值。根据我的测试,如果第一个赋值先执行,结果是[0,0]。如果第二个先执行,则为[1,1]。但综合起来,它是[