質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

2160閲覧

変数が更新されているのか?

退会済みユーザー

退会済みユーザー

総合スコア0

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2017/06/19 08:25

3 dog cat pig

という入力があった時に

input_lines = input() list_num = int(input_lines) all_data =[] for i in range(list_num): input_lines = input() all_data.append(input_lines) split_str=[] ans =[] two_str =[] for i in range(list_num): len_str = len(all_data[i]) split_str = list(all_data[i]) last_str = split_str[len_str-1] print(last_str) for i in range(list_num): len_str = len(all_data[i]) split_str = list(all_data[i]) last_str = split_str[len_str-1] z =split_str _str.pop() print(z) if last_str =='s' or 'sh' or 'ch' or 'o' or 'x': y = split_str.pop() print(y) z = y + 'es' ans.append(z) elif last_str =='f' or 'fe': y = split_str.pop() print(y) z = y + 'ves' ans.append(z) elif last_str =='y' and split_str[len_str-2] != 'a' or 'i' or 'u' or 'e' or 'o': y = split_str.pop() print(y) z = y + 'ies' ans.append(z) else: y = split_str.pop() print(y) z = split_str + 's' ans.append(z)

とコードを書きました。

z =split_str.pop() print(z) print(split_str)

と書いた部分で、

['d','o'] ['c','a'] ['p','i']

と出力されました。
2つわからないことがありまして、
ひとつは

split_str _str.pop()

は配列の最後の要素を切り取り、最後の要素を返すメソッドだと調べたら出てくるのですが、私の認識が何かおかしいのでしょうか?
2つめは、

print(split_str)

でも

['d','o'] ['c','a'] ['p','i']

と出力されたことで
zに最後の要素を切りとった結果を格納しているので
どうしてsplit_str までが変更されるのかわからないことです。
スコープの外だと思っていましたが、
変数が更新されているのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ozwk

2017/06/19 23:58

「z = split_str.pop()」と書こうと思っていたところを「z =split_str _str.pop()」と書いてしまってませんか?
guest

回答2

0

split_str = [] を宣言しているのは一番外側のスコープですね
基本的に内側からは外側が見えます。逆に外側から内側の変数は見えません

変数が更新されているのもその通りです
pop()というメソッドは最後の要素を取り出すだけではなくsplit_strも変更される点ですが、
このように変数自身にも変更を加えてしまうメソッドを破壊的メソッドと言います
通常のメソッドと異なり、指定変数(今回でいうsplit_str)の中身も常に意識しなければいけないので要注意です

更に踏み込むと、中身の把握を容易にするために一度定義したら更新できない変数をimmutableな変数, 逆に更新できてしまう変数をmutableな変数と呼んだりします
プログラミング言語によってもimmutableとmutableで流派が分かれたりするので、興味があったら調べてみて下さい!

スコープ参考:
http://uxmilk.jp/41353
pop参考:
https://python.g.hatena.ne.jp/muscovyduck/20080720/p1
immutable参考:
http://panda-noir.hatenablog.jp/entry/2015/10/18/191106

投稿2017/06/19 16:15

chck

総合スコア184

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

quickquip

2017/06/19 23:41

このコードはすべて同じスコープに属していますよ。
guest

0

ベストアンサー

配列の最後の要素を切り取り、最後の要素を返すメソッドだと調べたら出てくるのですが、私の認識が何かおかしいのでしょうか?

その通りですしおかしくないですよ。
pop() は配列から最後の要素を除去します。
それがわかっていれば不思議なところはないと思いますが、何が疑問なんでしょう??

Python

1s = 'dog' 2split_str = list(s) 3print(split_str) # => ['d', 'o', 'g'] 4 5z = split_str.pop() 6 7print(z) # => z 8print(split_str) # => ['d', 'o']

(追記)

配列の最後の要素を切り取り

もしかして「切り取る」の意味を誤解されたのでしょうか。
pop() は配列を更新して、最後の要素を除去するメソッドですから、 split_str が更新されるのは当たり前です。そういうメソッドです。
という回答になるでしょうか。

投稿2017/06/19 11:35

編集2017/06/19 23:47
quickquip

総合スコア11029

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問