[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2chのread.cgiへ]
Update time : 08/21 08:58 / Filesize : 249 KB / Number-of Response : 1002
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

くだすれPython(超初心者用) その5



1 名前:デフォルトの名無しさん mailto:sage [2009/10/24(土) 11:20:45 ]
このスレッドは、他のスレッドでは書き込めない超低レベル、
もしくは質問者自身何が何だか分からない質問を勇気を持って書き込むスレッドです。
へび使いが優しくコメントを返しますが、
お礼は Python の布教と初心者の救済をお願いします。

エラーを解決したいときはエラー表示や環境を略さずに書き込んで下さい。
騙りが頻発しています。質問する方は一時的なトリップをつけることを検討して下さい。
次スレは >>950 辺りで

前スレ
くだすれPython(超初心者用) その4
pc12.2ch.net/test/read.cgi/tech/1243160751/

関連スレ
Pythonのお勉強 Part35
pc12.2ch.net/test/read.cgi/tech/1253535109/

511 名前:510 mailto:sage [2009/12/22(火) 23:25:23 ]
のでどなたか教えていただけませんでしょうか。
よろしくお願い申し上げます。

512 名前:デフォルトの名無しさん mailto:sage [2009/12/22(火) 23:37:16 ]
>510 の質問の意図がわかりません。
のでどなたか教えていただけませんでしょうか。
よろしくお願い申し上げます。

513 名前:デフォルトの名無しさん mailto:sage [2009/12/22(火) 23:39:08 ]
>>508
ttp://www.youtube.com/watch?v=ihXtbB-4GWw
すげーな

514 名前:デフォルトの名無しさん mailto:sage [2009/12/22(火) 23:49:27 ]
>>512
…死ねばいいのに


515 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 00:01:08 ]
x[1:-1]=x[1:len(x)-1]
こんな感じでいいか?

516 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 00:20:58 ]
>>510
x[1]はCとあんまり変わらない。これはわかるとおもう。
x[1:3]みたいにコロンで区切られてた場合はスライスといって、
文字列の(正確にはシーケンスの)一部を取得できる。
x[1:3]だと、x[1]からx[3]の手前までだから"bc"。
あと、マイナスを使えば反対から数えられるから、x[1]から最後の一つ手前までで"bcd"。
リスト関係の処理はほんとに便利にできてるので勉強して損はない。

あとインデクシングって、「インデックスをつけること」だから意味がぜんぜん違うぞ。

517 名前:デフォルトの名無しさん [2009/12/23(水) 00:23:34 ]
x[:]

518 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 00:26:26 ]
ちなみに
x[:] → 'abcde'
x[-1] → 'e'
x[:-1] → 'abcd'
x[-1:] → 'e'

519 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 00:30:15 ]
要するに、x[a:b]のときはx[a]からx[b]の一つ手前(x[b-1])までになる。
ついでに、x[a:]はx[a]から最後までで、x[:b]は最初からx[b-1]まで。



520 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 01:06:53 ]
>>110
分かりにくいだろうから、説明画像をぱぱっと作った。
ttp://up.mugitya.com/img/Lv.1_up108952.png

というか、こういう画像はどっかにもあった気がするが…。

521 名前:デフォルトの名無しさん [2009/12/23(水) 01:10:33 ]
x[n] はcとか同様n+1番目の要素
x[a:b] は要素の区切り位置でa〜bの範囲の要素集合
と考えるとラク
"qwerty"なら
| q | w | e | r | t | y |
0  1  2  3  4  5  6

522 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 03:57:06 ]
x[]

523 名前:512 mailto:sage [2009/12/23(水) 08:24:17 ]
>>515-522
大変分かりやすい解説をいただき、
皆様ありがとうございます。

インデクシングという用語につきましては
> Python入門第2回 Pythonの文法
> ttp://www.f7.ems.okayama-u.ac.jp/~yan/python/python02.html
ここからのコピペでした。。。


524 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 09:33:21 ]
インデクシング indexing で別に間違ってないよ
印を付けるのと添え字で参照する、どちらの意味かは文脈から明らかだし

docs.python.org/tutorial/datastructures.html#tuples-and-sequences
> 5.3. Tuples and Sequences
> We saw that lists and strings have many common properties,
> such as indexing and slicing operations.

あと推薦図書スレからコピペ

Python 3 プログラミング徹底入門
著:マーク・サマーフィールド(Mark Summerfield

525 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 13:01:23 ]
>>524
ありがとうございます。


526 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 14:20:09 ]
>>> x='abcd'
>>> x.split()
['abcd']
>>> x[:]
'abcd'
>>> x.split('')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: empty separator
>>>

['a', 'b', 'c', 'd']
というリストにしたいときはどうすればいいでしょうか?

527 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 14:24:46 ]
>>526
list(x)

528 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 14:32:46 ]
>>527
ありがとうございます
なんかオブジェクト指向っぽくないですね

529 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 14:42:07 ]
perl に毒されすぎワロス wwww



530 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 14:43:15 ]
listオブジェクトのコンストラクタにイテレータブルなオブジェクト入れたらlistに変換できる、
って話だから思いっきりオブジェクト指向だぜ。

なんでもメソッド主義ってわけじゃないのは確かだが。

531 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 14:48:16 ]
>>> x[:]='abcd'
>>> x
['a', 'b', 'c', 'd']

532 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 14:49:57 ]
そんな黒魔術いらんがな

533 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 14:50:12 ]
>>530
len(x)
4
これはlenオブジェクトのコンストラクタにカウンタブルなオブジェクトを入れたんですね
わかります

534 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 14:50:38 ]
ていうか動きすらしないよなw
引っかかった漏れ乙

535 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 14:53:38 ]
>>534
>>> x=[]
>>> x[:]='abcd'
>>> x
['a', 'b', 'c', 'd']
スマソ


536 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 14:55:34 ]
>>533
lenはオブジェクトじゃねえよw

537 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 14:58:02 ]
>>536
オブジェクト指向に毒されてる人を皮肉ったんだろう

というか>>535が動いて悔しい
リファレンス読んでくる

538 名前:デフォルトの名無しさん [2009/12/23(水) 14:58:48 ]
wxWizardで次のページに進ませるにはどうしたらよいのでしょうか?

def Process(self):
  e = wx.wizard.WizardEvent(wx.wizard.EVT_WIZARD_PAGE_CHANGING)
  self.wizard.ProcessEvent(e)  #

wxWizardEventオブジェクトを生成してwxWizardオブジェクトのProcessEventメソッドに
渡していますが上手くいきません。

Traceback (most recent call last):
  File "C:\Documents and Settings\user\My Documents\python\testwizard.py", line 169, in Process
    self.wizard.ProcessEvent( wx.wizard.EVT_WIZARD_PAGE_CHANGING )
  File "C:\Program Files\python\lib\site-packages\wx-2.8-msw-unicode\wx\_core.py", line 3863, in ProcessEvent
    return _core_.EvtHandler_ProcessEvent(*args, **kwargs)
TypeError: in method 'EvtHandler_ProcessEvent', expected argument 2 of type 'wxEvent &'

539 名前:538 mailto:sage [2009/12/23(水) 15:04:17 ]
ごめんなさい。エラーメッセージが別のものでした。

Traceback (most recent call last):
  File "C:\Documents and Settings\user\My Documents\python\testwizard.py", line 167, in Process
    e = wx.wizard.WizardEvent(wx.wizard.EVT_WIZARD_PAGE_CHANGING)
  File "C:\Program Files\python\lib\site-packages\wx-2.8-msw-unicode\wx\wizard.py", line 84, in __init__
    _wizard.WizardEvent_swiginit(self,_wizard.new_WizardEvent(*args, **kwargs))
TypeError: in method 'new_WizardEvent', expected argument 1 of type 'wxEventType'




540 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 15:04:56 ]
>>537
>>536 は結局 x[:]=list('abcd') ってことでは?
perl っぽいが

541 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 15:18:30 ]
なにがperlっぽいのかよく分からない

542 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 15:19:11 ]
lenが嫌ならいちいち__len__呼んでろよ。

543 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 15:52:50 ]
>>540
www.python.org/doc/2.6/reference/simple_stmts.html#assignment-statements
"If the target is a slicing:" での説明からすると、>>540 の文や

>>> x = ['a']
>>> x[:] = ['a', 'b', 'c']
>>> x
['a', 'b', 'c']

はまだ理解できるんだけど、>>535

>>> x=[]
>>> x[:]='abcd'
>>> x
['a', 'b', 'c', 'd']

は左辺と右辺の型が list と str で異なってるから
> The assigned object should be a sequence object of the same type.
に違反してエラーになりそうな気がするんだけど、そうはならない
気味悪いから誰か説明してくださいお願いします

544 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 16:08:09 ]
スライシングの右側はイテレータならなんでも良かったはず。

545 名前:544 mailto:sage [2009/12/23(水) 16:16:02 ]
日本語がおかしかった。
リストのスライシングの代入文では、右辺にイテレータブルなオブジェクトをとる。

>>> x = []
>>> x[:] = {1: 'a', 2: 'b'}
>>> x
[1, 2]


546 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 16:16:38 ]
>>544
>>> L = []
>>> L[:] = open('c:/python26/license.txt')
>>> L[:5]
['A. HISTORY OF THE SOFTWARE\n', '==========================\n', '\n', 'Python w
as created in the early 1990s by Guido van Rossum at Stichting\n', 'Mathematisch
Centrum (CWI, see www.cwi.nl) in the Netherlands\n']

本当だ。見なかったことにしよう

547 名前:544 mailto:sage [2009/12/23(水) 16:25:02 ]
なぜ見なかったことにするんだw

ストリングを一文字ずつリストに入れるには list('abcd') が一番いいと思うよ。

548 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 16:30:52 ]
可読性を最大にするなら
[x for x in 'abcd']
どうみたって1文字ずつ分解してる

549 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 18:00:29 ]
TOOWTDIはどこいった...



550 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 18:06:20 ]
      >>544を信じますか?

   信じる         → 信じない


よしこれで俺のPythonは清いままだ

551 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 18:42:50 ]
>>> x=(1,2,3)
>>> y=[0,2,4,6,8]
>>> y[1:4] = x
>>> y
[0, 1, 2, 3, 8]

これでエラーが出て欲しいと申すか

552 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 18:44:32 ]
そんなこというなら*argsだってそうだ
from __future__ import print_function
print(*open('C:\\Python26\\LICENSE.txt'))

**kwargsだってdictっぽければいい
class Kwargs(object):
def __init__(self, **kwargs): self.kw = dict(kwargs)
def __getitem__(self, name): return self.kw[name]
def keys(self): return self.kw.keys()

def dump(**kwargs): print kwargs
dump(**Kwargs(a=1))

553 名前:デフォルトの名無しさん [2009/12/23(水) 23:14:04 ]
Windows XP上で、
標準入力から入力されたパスを調べて、
1.実在するディレクトリだったらそのディレクトリとサブディレクトリの中のファイルのフルパスの一覧を標準出力に出力する。
2.実在するファイルだったらそのフルパスを標準出力に出力する。
3.実在しないパスだったらエラーを標準出力に出力する。

こんなPythonスクリプトをどなたか書いて下さいませんか?


554 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 23:44:25 ]
Python の宿題ここで答えます Part 2
pc12.2ch.net/test/read.cgi/tech/1258320456/

555 名前:デフォルトの名無しさん mailto:sage [2009/12/23(水) 23:56:58 ]
>>554
ありがとうございます。
行ってきます。


556 名前:デフォルトの名無しさん mailto:sage [2009/12/24(木) 06:44:33 ]
>>551
めっそうもございません
お許しください

メモ
>>> a = [0, 1, 2]
>>> a[1:2] = 'abcde'
>>> a
[0, 'a', 'b', 'c', 'd', 'e', 2]

557 名前:デフォルトの名無しさん mailto:sage [2009/12/24(木) 12:05:17 ]
空飛ぶモンティパイソンを見ようと思うんだが
40thアニバーサリーBOX買っとけばいいのか?

558 名前:デフォルトの名無しさん [2009/12/24(木) 14:28:39 ]
>>538-539 おながいします

559 名前:デフォルトの名無しさん mailto:sage [2009/12/24(木) 16:55:54 ]
>>538-539 おなにいします



560 名前:デフォルトの名無しさん mailto:sage [2009/12/25(金) 20:24:26 ]
test

561 名前:デフォルトの名無しさん [2009/12/26(土) 14:54:36 ]
リストaに対して
a[len(a)]

a[len(a):]
を参照したり、代入したらエラーになりますか?
それともC系みたいに未定義の動作になりますか?


562 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 14:57:37 ]
>>561
全く問題ない

Cで未定義だというのも引っかかるものがあるんだが・・・・
未定義になる例を書いてCスレで一度質問した方がいいぞ

563 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 14:58:41 ]
んなわけないだろ俺死ね
忘れて下さい

564 名前:デフォルトの名無しさん mailto:sage [2009/12/26(土) 15:09:24 ]
>>561

>>> a = [1, 2, 3]
>>> a[len(a)]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: list index out of range

>>> a[len(a):] = ['a', 'b', 'c']
>>> a
[1, 2, 3, 'a', 'b', 'c']

>>> a[100:] = [1]
>>> a
[1, 2, 3, 'a', 'b', 'c', 1]

スライスへの代入はちと特殊
>>544あたりでやってるからそっち読んでね

565 名前:561 mailto:sage [2009/12/26(土) 17:11:26 ]
>>562-564
ありがとうございます。
> >>> a = [1, 2, 3]
> >>> a[len(a)]

> >>> a[len(a):] = ['a', 'b', 'c']
> >>> a
> [1, 2, 3, 'a', 'b', 'c']
はわりとすんなり納得しましたが
> >>> a[100:] = [1]
> >>> a
> [1, 2, 3, 'a', 'b', 'c', 1]
はびっくりしました。
こういう仕様なんですね。


566 名前:デフォルトの名無しさん mailto:sage [2009/12/27(日) 13:53:10 ]
ここでいいのかどうか分かりませんが教えてください
python で imap でメールを読んだものを html に出力すると
ヘッダ中のメールアドレスなどが <hoge@fuga.hage> になっている部分だけが
表示されません
たぶん <〜> で囲まれた部分が html のタグだとブラウザが解釈してしまうからだと思うのですが
python でこれを escape するにはどうするのが一般的でしょうか?

567 名前:デフォルトの名無しさん mailto:sage [2009/12/27(日) 13:58:45 ]
>>566
str.replace
str.translate
cgi.escape
xml.sax.saxutils.escape

568 名前:デフォルトの名無しさん mailto:sage [2009/12/27(日) 16:42:24 ]
>>> 2**10**4
19950631168807583848837421626835850838234968318861924548520089498529438830221946
63191996168403619459789933112942320912427155649134941378111759378593209632395785
とても長いので中略
70029097668650568557157505516727518899194129711337690149916181315171544007728650
57318955745092033018530484711381831540732405331903846208403642176370391155063978
90007428536721962809034779745333204683687958685802379522186291200807428195513179
48157624448298518461509704888027274721574688131594750409732115080498190455803416
826949787141316063210686391511681774304792596709376L

と表示されました。
2も10も4も普通の整数型だと思うのですが、
演算結果が自動的にlongな整数になっています。
これはどうしてでしょうか?
オーバーフローしそうになったら自動的にこうしてくれるのでしょうか?



569 名前:デフォルトの名無しさん mailto:sage [2009/12/27(日) 16:47:23 ]
そうです



570 名前:デフォルトの名無しさん mailto:sage [2009/12/27(日) 16:48:01 ]
>>569
ありがとうございます。
あと、
# coding: shift-jis
って書いてあるプログラムを見かけるのですが、
これはShift-JISで書いている場合は常に付けた方がよいものでしょうか?


571 名前:デフォルトの名無しさん mailto:sage [2009/12/27(日) 16:55:11 ]
>>570
u'そうですね'
をつねに使ってるなら無意味
'そうですね'
とかやってるなら書いといた方がいい

572 名前:デフォルトの名無しさん mailto:sage [2009/12/27(日) 16:57:43 ]
>>570

2.x系はデフォルトエンコーディングがASCIIなので、ソースコードに非ASCIIな文字を使ってるなら付ける必要あり。
>>571はダウト

573 名前:デフォルトの名無しさん mailto:sage [2009/12/27(日) 16:57:48 ]
>>571
なるほど。
お世話になり、ありがとうございました。

574 名前:デフォルトの名無しさん mailto:sage [2009/12/27(日) 16:58:47 ]
>>572
# coding: shift-jis
の記述じゃデフォルトエンコーディングはかわんねーだろ

575 名前:デフォルトの名無しさん mailto:sage [2009/12/27(日) 16:59:01 ]
>>572
自分が常にこれからもShift-JISで書き続けるとして、
# coding: shift-jis
と付けている分には悪いことはありませんか?

576 名前:デフォルトの名無しさん mailto:sage [2009/12/27(日) 17:04:47 ]
>>574
ソースコードのデフォルトエンコーディング。という意味でした。



577 名前:デフォルトの名無しさん mailto:sage [2009/12/27(日) 17:19:29 ]
print文の後ろに,が付くか付かないかで改行されるかどうかが決まるのでしょうか?

付けると改行されず、付けないと改行される、でよろしいですか?


578 名前:デフォルトの名無しさん mailto:sage [2009/12/27(日) 17:21:19 ]
>>577
はい。リファレンスマニュアルのprint文の箇所も参照してね。

579 名前:デフォルトの名無しさん mailto:sage [2009/12/27(日) 17:27:25 ]
>>578
ありがとうございます。
print 文がカンマで終了していない限り、末尾には文字 "\n" が書き出されます。この仕様は、文に予約語 print がある場合のみの動作です。




580 名前:デフォルトの名無しさん mailto:sage [2009/12/27(日) 17:33:07 ]
このようにprint文は特殊なので
3.0からは関数になります。

581 名前:デフォルトの名無しさん mailto:sage [2009/12/27(日) 17:34:08 ]
import math

from math import *
とでは、
伝統や文化的な理由で
どちらが推奨されるとかありますか?


582 名前:デフォルトの名無しさん mailto:sage [2009/12/27(日) 17:55:00 ]
>>581
一般的には前者推奨。
後者は小規模スクリプトかインタラクティブシェルで使うぐらい。

583 名前:デフォルトの名無しさん mailto:sage [2009/12/27(日) 18:09:16 ]
>>582
ありがとうございます。


584 名前:デフォルトの名無しさん mailto:sage [2009/12/27(日) 21:26:49 ]
Windowsで
〜.py(ttp://codepad.org/tXDoThvC)をダブルクリックした場合
これを実行すると、コマンドプロンプトが一瞬で閉じてしまいます。
(コマンドラインからpython 〜.pyとする文には大丈夫ですが。)

最後に何かキー入力を受けるまで画面を閉じないようにする
1文などありませんでしょうか?


585 名前:デフォルトの名無しさん mailto:sage [2009/12/27(日) 21:28:32 ]
import os
os.system('pause')

586 名前:デフォルトの名無しさん mailto:sage [2009/12/27(日) 21:44:31 ]
>>585
ありがとうございます!
まさにこれがしたかったです。


587 名前:デフォルトの名無しさん mailto:sage [2009/12/27(日) 21:48:30 ]
codepadでは通るこのコード
ttp://codepad.org/6ggvcFhC

Python 2.6.4で、エラーになります。
エラーメッセージは
ttp://codepad.org/3o9Vqzu4
です。
どうしてでしょうか。。。

588 名前:デフォルトの名無しさん mailto:sage [2009/12/27(日) 22:20:43 ]
>>587
同じディレクトリに random.py があるんじゃね?

589 名前:デフォルトの名無しさん mailto:sage [2009/12/27(日) 22:48:06 ]
>>588
それでした。
どうもありがとうございます。



590 名前:デフォルトの名無しさん mailto:sage [2009/12/27(日) 23:21:37 ]
 a=[3,7]
 b=a
 a=a+[2]
を実行すると
 b は [3,7]
 a は [3,7,2]
となる。他方
 a=[3,7]
 b=a
 a.append(2)
を実行した場合には
 a も b も [3,7,2]
である。

この違いにびっくりしました。
Pythonは基本的には参照を渡すのか、コピーを渡すのか、
どっちが多いですか?


591 名前:デフォルトの名無しさん mailto:sage [2009/12/27(日) 23:34:32 ]
>>590
まず、Pythonの変数は全部参照だから、「渡す」のは全部参照。
コピーを作ってそのコピーの参照を渡すのか、元の参照を渡すのかの違いでしかない。
a = [3,7] # [3,7] というリスト (A) を作って、その参照を a に入れる
b = a # a に入っている (A) への参照を b に入れる
a = a + [2] # a + [2] で、 (A) と [2] を連結した新しいリスト (B) を作る。そしてそれを a に代入する。
a.append(2) # a が参照しているリスト (A) に、 2 という値のオブジェクトへの参照を追加する。

+ という演算子が「新しいオブジェクトを作る」という動作をしている。
# immutable な型なら、+ 演算子で新しいオブジェクトを作らずに既存のオブジェクトを使いまわすのもアリ

592 名前:>590 >505 mailto:sage [2009/12/27(日) 23:39:21 ]
>>591
あー、なるほど!
非常に分かりやすい解説ありがとうございます。
どうにもC++で型宣言を意識していたため、よく分かっておりませんでした、
ありがとうございました。


593 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 08:08:06 ]
ばっさばっさとさばいておりますな。初心者スレにふさわしい。

594 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 10:17:58 ]
ttp://codepad.org/tdwJTVZ8
この挙動も
> この不自然な結果は、Pythonが a=[[0]*3]*3 を処理するのに (内部で)
>  t=[0]*3
>  a=[t]*3
> とやった為に発生したと考えられる。
> この問題は次のようにすれば回避できる。
>  a=[0]*3
>  a[0]=[0]*3
>  a[1]=[0]*3
>  a[2]=[0]*3
こう説明がありました。
うーん。
つまり[0]*3は新しく別のリストを作っており、一方
a=[t]*3は[t, t, t]だから その場に存在しているリストは
a==[t, t, t]とt==[0, 0, 0]の2つだということですか?


595 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 10:22:35 ]
[0] * 3 は [0, 0, 0] という新しいリストを作る
[t] * 3 は [t, t, t] という新しいリストを作る

0 は immutable だから、同じオブジェクトの参照がたくさんあっても問題にならないけど、
リストは mutable だから、同じオブジェクトの参照がたくさんあると、一つを書き換えると他からの
参照にも影響を与える。

596 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 10:44:34 ]
>>595
ありがとうございます。
ttp://codepad.org/KWHJEbWb
これでxの値を7から-5に変更したら、
tは[x, x, x]で
aは[t, t, t]なので
t, aが共に変更されるのではないかと思うのですが、
実際は変更されません。
これは何故でしょうか。


597 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 11:15:04 ]
>>596
これで納得してくれるかは怪しいけど

a = 1 # 名前 a は 1 を指す
a # 名前 a を評価する。評価して得られた値は 1
b = [a, a] # 名前 b は [a, a] を評価して得たリスト [1, 1] を指す
a = 2 # 名前 a は 2 を指す
b # 名前 b は相変わらず [1, 1] を指したまま

あと a = 1 は「名前は a を指す」って代入文であって数学の等式じゃないから気をつけて
a = 1; a = 2 なんてのも Python では成立する

598 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 11:29:24 ]
>>596
リストはオブジェクトへの参照のリスト。
他の言語で参照というと変数への参照の場合があるけど、Pythonの場合は変数への参照は無い。

x = 7 # 7 という値のオブジェクト (A) を用意して、x が (A) を参照するようにする。
[x] # x が参照している (A) というオブジェクト一つを要素にしたリスト [ (A) ] を作る。このオブジェクトを(B) とする。
t = [x] * 3 # (B) を3回繰り返したリストのオブジェクトを作る。これを (C) とする。 (C) は [(A), (A), (A)] になる。 t に (C) への参照を代入する。
[t] # t が参照している (C) というオブジェクト一つを要素にしたリスト [ (C) ] つまり [ [ (A), (A), (A)] ] を作る。このオブジェクトを (D) とする。
a = [t] * 3 # (D) を3回繰り返したリストのオブジェクト [ (C), (C), (C) ] をつくる。このオブジェクトを (E) とする。

x = -5 # -5 という値のオブジェクト (F) を用意して、 x が (F) を参照するようにする。 (A) の値は変更されない。

結果として、 a が参照しているオブジェクト (E) の値は [(C), (C), (C)], t が参照しているオブジェクトは (C),
(C) の値は [(A), (A), (A)]. (A) の値は 7 のまま。

599 名前:591=595=598 mailto:sage [2009/12/28(月) 11:46:52 ]
ちなみに、>>590はどの言語の経験があるの?
ベースとなる言語があれば、その言語で言えばどういう意味か説明に使える。

>>596 を Javaで書き換えると、

Integer x = Integer.fromInt(7); // x = 7

ArrayList<Object> t = new ArrayList<Object>();
for (int i = 0; i < 3; i++) t.add(x); // t = [x] * 3

ArrayList<Object> a = new ArrayList<Object>()
for (int i = 0; i < 3; ++i) a.add(t); // a = [t] * 3

x = Integer.fromInt(-5); // x = -5

Javaが判れば、xを書き換えてもaやtに影響ないのが判ると思う。



600 名前:599 mailto:sage [2009/12/28(月) 11:52:55 ]
ごめん、 Integer.fromInt は Integer.valueOf の間違い。

JavaはPythonのオブジェクトを説明するのには向いているけど、
ここ5年以上マトモに使えてないので、文法エラーやメソッドのミスには目をつぶってくれ。

ちなみに、Pythonのオブジェクトを説明するのにJavaが向いている理由は、
整数と文字列がimmutableだから。
x = 7
y = 7
で x is y の結果が言語で規定されていない理由は、
Integer x = Integer.valueOf(7);
Integer y = Integer.valueOf(7);
x == y の結果が言語で規定されていない理由と同じ。

601 名前:590 mailto:sage [2009/12/28(月) 11:54:47 ]
みなさまありがとうございます。
私はC++プログラマです。
そのため変数の型宣言がないPythonを学び、
ところどころで困惑してお世話になっております。

とても長くなったため私の現在の認識を自分でながめるために書き出してみました。
ttp://codepad.org/MJaNWykh

Javaの経験はありませんが、ご教示いただいたJavaコードはC++な見方で
推測して拝見しました。
そことのアナロジーで解釈しても
この1.〜3.の解釈は正しいと思うのですが、
そうだとしますと
4.でt, aが変更される理由がまた分からなくなります。

どうして4.だけ変更されるのでしょうか?


602 名前:600=methane mailto:sage [2009/12/28(月) 12:12:25 ]
>>601
C++にはJavaのObject型みたいなのがないから、void*で代用するけど、こんな感じになる。 (キャストは省略)
x = 7
t = [x]*3
a = [t]*3

void *x = new int(7);

vector<void*> *t = new vector<void*>;
for (int i = 0; i < 3; ++i) t->push_back(x);

vector<void*> *a = new vector<void*>;
for (int i = 0; i < 3; ++i) a->push_back(t);

ここまでで初期状態。
じゃぁ、初期状態から t = 3.14 を C++ でいうと、
t = new double(3.14);
t が新しく別のオブジェクトをポイントするようになるだけで、 a[0]は、もともとtが指していた [7,7,7] を差し続ける。

つぎに、初期状態から a[0][0] = -5 を C++ でいうと、
(*((*a)[0]))[0] = -5;
t というポインタが指している vector オブジェクトの先頭要素を -5 に書き換えている。
で、tもaもポイントしている先は変わらないまま、tがポイントしているvectorオブジェクトの先頭要素だけを書き換えているので、
t と a の両方が影響を受ける。

603 名前:methane mailto:sage [2009/12/28(月) 12:21:08 ]
C++プログラマなら、Pythonの変数は全部C++でいうポインタ変数で、オブジェクトは全部
new やその他の手段でヒープ上に取られるという理解をすると良いと思う。

「参照」と呼んでいるのは全部ポインタのことで、

int a = 3;
int &x = a;
int *y = &a;

でいうところの a のような、変数と値が完全に束縛された存在が無い。
あとは、
a[0][0] = -5 がリスト「オブジェクトに対する変更」なのにたいして、
t = -5 がオブジェクトは全く変更されず、「ポインタ変数が別のアドレスを指すようになる」
という違いを把握できれば、一気に壁を突破できるはず。

604 名前:590 mailto:sage [2009/12/28(月) 12:27:42 ]
>>602-603methane氏
C++に例えてくださりありがとうございました。
現在必死に読んでおります。


605 名前:590 [2009/12/28(月) 12:45:51 ]
値は全て無名であると考えてよろしいですか?


606 名前:methane mailto:sage [2009/12/28(月) 12:52:35 ]
>>605
コード上に出てきた変数名と密結合しているオブジェクトが存在しないという意味であれば、すべて無名ですね。

def foo(): pass
bar = foo
del foo

したら、foo()できなくてbar()できるし、 class もモジュールもパッケージも、名前とオブジェクトの関係は全部同じです。

607 名前:590 mailto:sage [2009/12/28(月) 13:10:02 ]
おかげさまで理解できたと思います。
つまり
 ttp://uproda.2ch-library.com/lib200590.zip.shtml
こんなことになっているんですね。
(Wordファイルをzipで圧縮したもので
 DLキーはpythonです。)
この理解でよろしいでしょうか?

608 名前:methane mailto:sage [2009/12/28(月) 13:31:10 ]
>>607
5番が書きかけなのかな・・・
4番までは完全に正解。Good Job.

609 名前:590 mailto:sage [2009/12/28(月) 13:35:52 ]
>>608
5.番は
 t[0]=−5
以外は4.と相違点ありません。
a[0][0]=-5とt[0]=−5が等価であるという事を言いたかった図です。
どうでしょうか。



610 名前:デフォルトの名無しさん mailto:sage [2009/12/28(月) 13:37:57 ]
>>571はダウト

611 名前:methane mailto:sage [2009/12/28(月) 13:42:55 ]
>>609
あぁ、4からコピーした後編集するの忘れてると勘違いしてました。
a[0][0] と t[0] は等価で図は完全一致で正解です。
図だと判りやすいですね。






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<249KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef