32

このリンクから:参照によって変数を渡すにはどうすればよいですか? 、Python は文字列 (不変の型変数) をパラメーターとして関数に渡すときにコピーしますが、文字列が巨大な場合はメモリを浪費すると思います。多くの場合、関数を使用して文字列の一部の操作をラップする必要があるため、より効果的に行う方法を知りたいですか?

4

7 に答える 7

39

Python は、関数に渡されたオブジェクト (文字列を含む) のコピーを作成しません。

>>> def foo(s):
...     return id(s)
...
>>> x = 'blah'
>>> id(x) == foo(x)
True

関数内の文字列を「変更」する必要がある場合は、新しい文字列を返し、元の名前に割り当てます。

>>> def bar(s):
...     return s + '!'
...
>>> x = 'blah'
>>> x = bar(x)
>>> x
'blah!'

残念ながら、大きな文字列がコピーされるため、大きな文字列に小さな変更を加える場合、これは非常に非効率的です。これに対処する Pythonic の方法は、文字列をリストに保持し、すべての断片を取得したらそれらを結合することです。

于 2012-11-28T15:46:49.930 に答える
5
def modify_string( t ):
  the_string = t[0]
  # do stuff

modify_string( ["my very long string"] )
于 2012-11-28T16:20:11.087 に答える
5
In [7]: strs="abcd"

In [8]: id(strs)
Out[8]: 164698208

In [9]: def func(x):
    print id(x)
    x=x.lower() #perform some operation on string object, it returns a new object
    print id(x)
   ...:     

In [10]: func(strs)
164698208              # same as strs, i.e it actually passes the same object 
164679776              # new object is returned if we perform an operation
                       # That's why they are called immutable  

ただし、文字列に対する操作は常に新しい文字列オブジェクトを返します。

于 2012-11-28T15:48:24.680 に答える
1

他のパラメーターと同じように渡すだけです。内容はコピーされず、参照のみがコピーされます。

于 2012-11-28T15:46:50.990 に答える