1

Python でリストを操作するためのメソッドの使用について、私はかなり混乱しています。あなたが持っていると言う

mylist = [1,2,3,4]
mylist.append(5) #works fine, 

しかし、私が置くとき

def adding(mylist):
    mylist.append(5)

print adding(mylist) #will print out the orginal list without the 5.

また、

data2 = data3 = [1,2,3]
data2 = data2 +[4]+[5]+[6] # doesn't works
data3 += [4] +[5] +[6] #works

しかし、私はそれらがどのように機能するかについてかなり混乱しています。

だから私はリストを操作するためのさまざまな方法のリストを(Pythonの観点からではなく)作りたいと思っています。誰でも助けることができますか?

4

4 に答える 4

2
def adding(mylist):
    mylist.append(5)

print adding(mylist) 

あなたのaddingメソッドは何も返しません..

return mylist次のようにメソッドの後に a を追加mylist.append(5)しますadding: -

def adding(mylist):
    mylist.append(5)
    return mylist
print adding(mylist)

または、このコードに置き換えることもできprint adding()ます (何も返さない場合):-

adding(mylist)
print mylist

そして、あなたの2番目の問題について: -

>>> data2 = data3 = [4, 5, 6]
>>> data2 = data2 + [1] + [2] + [3]
>>> print data2
[4, 5, 6, 1, 2, 3]
>>> data3 += [1] + [2] + [3]
>>> print data3
[4, 5, 6, 1, 2, 3]

実際、私にとっては、両方とも機能します..そして、それは機能するはずです.あなたが得ている出力は何ですか?? (特に、あなたの出力は何を期待していますか??)

于 2012-09-27T04:51:23.380 に答える
2

元のコードが機能することを期待する理由は、C++ などの言語での参照渡しに慣れているからだと思います。その場合、参照渡しと値渡し違いを認識することが重要です。Python がどちらを使用しているかを理解することはさらに重要です。

要するに、Python は実際には参照渡しも値渡しも使用しません。受け渡しは、Python のオブジェクトを介して行われます。


長い答え:

値渡しの例は、C で作成できます。

#include <stdio.h>

void adding(int i) {
    i = i + 1;
}

int main() {
    int i = 0;
    adding(i);
    printf("i is %d\n", i);  // will print "i is 0"
    return 0;
}

ここで、 i の値はに渡されるときにコピーさadding()れます。int i内部 は、元の内部adding(int i)とは異なるメモリ位置にあります。そのため、 内では、のスコープ内でのみ既知のメモリ チャンク内の値にのみ影響します。イン は別のメモリ チャンクに存在するため、まったく影響を受けません。int imain()adding()i = i + 1adding()imain()

参照渡しの例は、C++ で作成できます。

#include <iostream>

void adding(int &i) {
    i = i + 1;
}

int main() {
    int i = 0;
    adding(i);
    std::cout << "i is " << i << std::endl;  // will print "i is 1"
    return 0;
}

ここでiは、 への参照によって渡されますadding()iinsideは、 inadding()とまったく同じメモリのチャンクを参照します。したがって、1 にインクリメントされます。imain()i


さて、あなたの例に戻ってPythonについて話しましょう(あなたが実際に何を意味したかを推測して修正しました=]):

# Case 1
mylist = [1,2,3,4]
mylist.append(5)  # will print [1,2,3,4,5]

# Case 2
mylist = [1,2,3,4]
def adding(mylist):
    mylist.append(5)

adding(mylist)
print mylist  # will print [1,2,3,4,5]

# Case 3
mylist = [1,2,3,4]
def adding(mylist):
    mylist = mylist + [5]

adding(mylist)
print mylist  # will print [1,2,3,4]

# Case 4
mylist = [1,2,3,4]
def adding(mylist):
    mylist += [5]

adding(mylist)
print mylist  # will print [1,2,3,4,5]

ここでmylistは、値でも参照でも渡されません。実際にはオブジェクトによって渡されます。

Python ではmylist = [1,2,3,4]、リストを作成し、それにタグ[1,2,3,4]を付け ます。ここで注意すべき重要なことは、list が オブジェクトであるということです (IIRC、すべてのオブジェクトは、またはその拡張です)。 mylistPyObject

この違いを理解すると、次の例の出力を理解できるようになります。

  1. ケース 1では、リスト オブジェクトで直接.append()呼び出され[1,2,3,4]てリスト値が変更されるため、myobjectアタッチ先のオブジェクトが変更されています。Python ではリストが変更可能なオブジェクトであるため、これが可能であることに注意してください。

  2. ケース 2では、mylistに渡す際にコピーされず、ケース 1adding()と同様に、同じリスト オブジェクトに「アタッチ」されます。したがって、 このオブジェクトを呼び出すと、オブジェクト自体が変更されます。の外では 、(オブジェクト自体が変更されていても) は同じオブジェクトにアタッチされているため、[1,2,3,4,5] という出力が得られます。.append()adding()mylist

  3. ケース 3では、内部adding()で、ローカル変数mylistが によって作成された新しいオブジェクトにアタッチされ[1,2,3,4]+[4]ます。ただし、元のオブジェクトmylist が指しているオブジェクトは変更されていないため、出力は のまま [1,2,3,4]です。

  4. ケース 4は少しトリッキーです。Python のリストは変更可能で、呼び出し元のオブジェクト自体に作用する の+=ようなショートカットとして機能します。.extend()したがって、元のオブジェクトは変更され[1,2,3,4,5]mylistまだそれにアタッチされています。タプル、文字列、数値などの不変オブジェクトの場合、新しい+=オブジェクトを作成し、それに変数をアタッチすることにも注意してください。


Python でリストを使用するさまざまな方法については、Fredrik Lundh によって書かれたこの記事に非常に詳細な情報が含まれています。

于 2012-09-27T23:28:15.960 に答える
1
def adding(mylist):
    mylist.append(5)

print adding(mylist) 

返品の記載はありません。

print mylist
[1,2,3,4,5]

参照渡しなので、これは [1,2,3,4,5] を出力します。したがって、リストを返さなくても、mylist は変更されます。

data2 = data3 = [1,2,3]
data2 = data2 +[4]+[5]+[6] #Actually works 
于 2012-09-27T07:21:41.713 に答える
1

関数から何も返さないため、printadding(mylist)は印刷する必要があります。Noneadding()

以下:

def adding(mylist):
    mylist.append(5)

test_list = range(5)

print adding(test_list)

print test_list

adding(test_list)

print test_list

次の出力が生成されます。

None
[0, 1, 2, 3, 4, 5]
[0, 1, 2, 3, 4, 5, 5]

2 番目の例について、より具体的に説明できますか? data2 とはそもそも何ですか?あなたは何を期待していますか?

于 2012-09-27T04:48:56.490 に答える