2016-10-02 17 views
0

を変更された文字列変数の更新は、我々がそうのようないくつかのコードを持って言うことはありません:は、なぜ彼らは

placehold = "6" 
string1 = "this is string one and %s" % placehold 

print string1 

placehold = "7" 
print string1 

実行すると、placeholdは直前に、しかし常に6であるかのようにprint文の両方を返します2番目の文が実行され、プレースホルダが7に変更されたので、なぜ文字列に動的に反映されないのですか?

また、7で文字列を返す方法を提案できますか?

+1

文字列は不変です。彼らは変わらない。 'StringVar'のようなものを使用するか再割り当てする – Li357

+1

' string1 = 'の値を 'placehol'の値に変更した後、これは' string1 = "これを文字列1と"%placehold "変化する。 – Abdou

答えて

3

あなたがないとき:

string1 = "this is string one and %s" % placehold 

あなたが後でplaceholdの値を変更するにはplaceholdの値に置き換え%sで文字列string1を作成している文字列が保持していないとして、それはstring1への影響はありません。変数の動的プロパティ値が変更された文字列を反映するには、再度文字列を割り当てる必要があります。

また、あなたが使用すること.format()として:

string1 = "this is string one and {}" 
placeholder = 6 
print string1.format(placeholder) 
# prints: this is string one and 6 

placeholder = 7 
print string1.format(placeholder) 
# prints: this is string one and 7 
1

string1string1が宣言された時点で存在していたものは何でもplaceholdの値が使用されます、ありがとうございました。あなたの例では、その値は"6"です。 string1に「return with 7」を取得するには、placeholdの値を変更した後に、それを再割り当てする必要があります(string1 = "this is string one and %s" % placehold)。

4

ステートメントを実行すると、すでにその変数に値が割り当てられているためです。

def f(placehold): 
    return "this is string one and %s" % placehold 

は今、あなたはprint(f("7"))所望の機能を達成することができます。

は、それはあなたが、むしろのような機能を必要とするだろうように聞こえます。

2

文字列は不変であり、変更することはできませんが、あなたが何をしようとしていることのいずれか可変オブジェクトでは動作しませんので、可変性(またはその欠如)は、ここでは赤いニシンの何かです。

本当の理由は、PythonがExcelのように動作しないということです。オブジェクトは、そのオブジェクトに対して実行されたすべての操作を覚えておらず、その中に入った情報を変更したときにそれらの操作を再実行します。 Pythonがそのように機能するためには、言語は、すべてのオブジェクトがこれまでに持っていたすべての状態、またはそれらのパラメータとともに実行されたすべての操作を保持する必要があります。どちらの場合でも、プログラムのメモリ使用量が増え、実行速度が低下します。さらに、string1を別の式で使用したとします。その値も更新する必要があります。 Python 3では、print()は関数です。変数が変更されたときに再び呼び出されるべきですか?

ある程度はそのように動作する言語がありますが、Pythonはその1つではありません。明示的に(関数を記述して呼び出して)明示的に手配しない限り、Pythonは式を一度評価し、その正確な結果を今後使用します。

実際に、あなたが望むのはPythonでも不可能です。文字列補間(%操作)を実行すると、コードは補間している値だけを表示します。 "6"placeholdという変数から来ていることはわかりません。したがって、それが望む場合であっても、後で文字列を変更することはできませんでした。placeholdstring1の間に関係があることを知る方法がないためです。 (例えば、placehold + "0"のような式でも構わないので、後で再評価するために、Pythonは変数名だけでなく、式全体を覚えておく必要があります)

は、あなたが望む特定の動作を提供するために、独自の文字列のサブクラスを書くことができます。

class UpdatingString(str): 
    def __str__(self): 
     return self % placehold 

placehold = "6" 
string1 = UpdatingString("this is string one and %s") 
print(string1) 
placehold = "7" 
print(string1) 

をしかし、これはスコープの問題(基本的には、クラス変数とすることを意味し、placeholdを見てできるようにする必要がありますをはらんでいますクラスは同じ関数またはグローバルスコープで定義する必要があります)。また、この特別な文字列を、別の文字列、例えば連結を伴う操作で使用すると、それはほぼ確実に特別な処理を中止します。これらの問題を解決することは可能ですが、髪の毛がかかっています。私はそれをお勧めしません。

+0

素敵な説明と解決策! – Li357