162

以下に示すように変数を初期化するために複数の割り当てを使用しようとしましたが、動作に混乱しました。値リストを個別に再割り当てすることを期待しています。つまり、b[0] と c[0] は以前のように 0 です。

a=b=c=[0,3,5]
a[0]=1
print(a)
print(b)
print(c)

結果: [1, 3, 5] [1, 3, 5] [1, 3, 5]

あれは正しいですか?複数の割り当てには何を使用すればよいですか? これと何が違うの?

d=e=f=3
e=4
print('f:',f)
print('e:',e)

結果: ('f:', 3) ('e:', 4)

4

11 に答える 11

92

咳咳

>>> a,b,c = (1,2,3)
>>> a
1
>>> b
2
>>> c
3
>>> a,b,c = ({'test':'a'},{'test':'b'},{'test':'c'})
>>> a
{'test': 'a'}
>>> b
{'test': 'b'}
>>> c
{'test': 'c'}
>>> 
于 2014-02-06T22:36:30.500 に答える
16

Python では、すべてがオブジェクトであり、「単純な」変数タイプ (int、float など) も同様です。

変数値を変更すると、実際にはそのポインターが変更さ、2 つの変数を比較すると、それらのポインターが比較されます。(明確にするために、ポインターは、変数が格納されている物理コンピューター メモリ内のアドレスです)。

その結果、内部変数の値を変更すると、メモリ内の値が変更され、このアドレスを指すすべての変数に影響します。

あなたの例では、次の場合:

a = b =  5 

これは、a と b が値 5 を含むメモリ内の同じアドレスを指すことを意味しますが、次の場合は次のようになります。

a = 6

a は 6 を含む別のメモリ位置を指し、b は引き続き 5 を含むメモリ アドレスを指しているため、b には影響しません。

しかし、あなたがするとき:

a = b = [1,2,3]

a と b は同じ場所を指していますが、違いは、リストの値の 1 つを変更した場合です。

a[0] = 2

a が指すメモリの値を変更しますが、a は依然として b と同じアドレスを指しており、結果として b も変更されます。

于 2013-05-02T22:46:32.217 に答える
12

id(name)2 つの名前が同じオブジェクトを表しているかどうかを確認するために使用できます。

>>> a = b = c = [0, 3, 5]
>>> print(id(a), id(b), id(c))
46268488 46268488 46268488

リストは変更可能です。これは、新しいオブジェクトを作成せずにその場で値を変更できることを意味します。ただし、値を変更する方法によって異なります。

>>> a[0] = 1
>>> print(id(a), id(b), id(c))
46268488 46268488 46268488
>>> print(a, b, c)
[1, 3, 5] [1, 3, 5] [1, 3, 5]

に新しいリストを割り当てるとa、その id が変更されるため、bおよびcの値には影響しません。

>>> a = [1, 8, 5]
>>> print(id(a), id(b), id(c))
139423880 46268488 46268488
>>> print(a, b, c)
[1, 8, 5] [1, 3, 5] [1, 3, 5]

整数は不変であるため、新しいオブジェクトを作成せずに値を変更することはできません。

>>> x = y = z = 1
>>> print(id(x), id(y), id(z))
507081216 507081216 507081216
>>> x = 2
>>> print(id(x), id(y), id(z))
507081248 507081216 507081216
>>> print(x, y, z)
2 1 1
于 2013-05-02T22:48:10.330 に答える
7

あなたの最初の例では、a = b = c = [1, 2, 3]あなたは本当に言っています:

 'a' is the same as 'b', is the same as 'c' and they are all [1, 2, 3]

「a」を 1、「b」を「2」、「c」を 3 に設定するには、次のようにします。

a, b, c = [1, 2, 3]

print(a)
--> 1
print(b)
--> 2
print(c)
--> 3

お役に立てれば!

于 2013-05-02T22:36:00.483 に答える
4

簡単に言えば、最初のケースでは、複数の名前をlist. list のコピーが 1 つだけメモリに作成され、すべての名前がその場所を参照します。したがって、いずれかの名前を使用してリストを変更すると、実際にはメモリ内のリストが変更されます。

2 番目のケースでは、同じ値の複数のコピーがメモリ内に作成されます。したがって、各コピーは互いに独立しています。

于 2016-01-30T05:28:25.390 に答える
3

必要なものはこれです:

a, b, c = [0,3,5] # Unpack the list, now a, b, and c are ints
a = 1             # `a` did equal 0, not [0,3,5]
print(a)
print(b)
print(c)
于 2013-05-02T22:35:37.633 に答える
3

私が必要とすることを行うコードは次のようになります:

# test

aux=[[0 for n in range(3)] for i in range(4)]
print('aux:',aux)

# initialization

a,b,c,d=[[0 for n in range(3)] for i in range(4)]

# changing values

a[0]=1
d[2]=5
print('a:',a)
print('b:',b)
print('c:',c)
print('d:',d)

結果:

('aux:', [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]])
('a:', [1, 0, 0])
('b:', [0, 0, 0])
('c:', [0, 0, 0])
('d:', [0, 0, 5])
于 2013-05-03T04:02:52.653 に答える