Lisp では、次のように言うことができます。
(setf (aref a 1) 5)
perl では次のように言えます。
substr( $string, $start, $stop ) =~ s/a/b/g
Pythonでこのようなことは可能ですか?関数の結果を左辺値として (代入演算の対象として) 使用することは可能ですか?
いいえ。関数呼び出しの結果への代入は、コンパイラ レベルでは明確に禁止されています。
>>> foo() = 3
File "<stdin>", line 1
SyntaxError: can't assign to function call
ただし、Python 構文には 2 つの特殊なケースがあります。
# Slice assignment
a = [1,2,3,4]
a[0:2] = 98, 99 # (a will become [98, 99, 3, 4])
# Tuple assignment
(x, y, z) = (10, 20, 30)
また、Python にはステートメント/関数の二重性があり、代入または拡張代入 ( +=
、*=
...) は単なる通常の演算子ではなく、ステートメントであり、特別な規則があることにも注意してください。
さらに、Python には「ポインター」の一般的な概念はありません。何かを格納する場所を関数に渡す唯一の方法は、「セッター」クロージャーを渡すことです。割り当て可能な場所を見つけるには、明示的な名前を使用する必要があるためです。または、場所がオブジェクト インスタンス メンバーの場合は、インスタンス ディクショナリを操作する必要があります)。
# Pass the function foo where to store the result
foo( lambda value : setattr(myObject, "member", value) )
いいえ、一般的にこれを行う方法はありません。スライス表記は、次のようなことができるため、限られたケースで近くなります。
>>> a = [1, 2, 3]
>>> a[1:2] = [5, 6]
>>> a
[1, 5, 6, 3]
要するに、いいえ。
ただし、 を定義する__setitem__
と、添字に割り当てることができます。
foo['subscript'] = 7
foo
そして、関数から (必要に応じて添え字も)返すことができます。
container, subscript = whatevs()
container[subscript] = 7
または、1行で:
operator.setitem(*(whatevs()+(7,)))
を参照してくださいoperator
。
一般的に、いいえ (読むのをやめないでください!!!!)。次の点に注意してください。
class test:
test = 4
test().test = 5
# we can no longer refer to the created object.
x = test().test = 6
x # 6
ただし、いくつかの検索を行うと、これが見つかりました(これは悪い習慣のように見えますが、使用可能です):
globals()["varname"] = 5
varname # 5
だから、あなたの Perl と私の Python を混ぜると、次のようになります:
globals()[substr( $string, $start, $stop )] = something
substr( $string, $start, $stop ) # something
# Note: wouldn't work because the function returns a string.
# I just don't know what the function returns.
# so exec("print " +substr( $string, $start, $stop ) I guess
# similarly, and possibly a little better practice
locals()["somethingdif"] = somethingelse
somethingdif # somethingelse
大規模なマイナス投票を軽減するために、これでプログラムを完全に台無しにすることができることに言及する必要があります. しかし、あなたはおそらくそれを知っています。"somevar" not in locals()
またはをチェックして、このメソッドを使用するときに既存の変数を上書きしないようにしてください"somevar" not in globals()
。