我知道这is用于比较两个对象是否相同但是==是否相等.根据我的经验is总是为数字工作,因为Python重用数字.例如:
>>>a = 3
>>>a is 3
True
Run Code Online (Sandbox Code Playgroud)
is每当我将某些东西与数字进行比较时,我习惯使用它.但是is下面这个程序不起作用:
from collections import namedtuple
# Code taken directly from [Udacity site][1].
# make a basic Link class
Link = namedtuple('Link', ['id', 'submitter_id', 'submitted_time', 'votes',
'title', 'url'])
# list of Links to work with
links = [
Link(0, 60398, 1334014208.0, 109,
"C overtakes Java as the No. 1 programming language in the TIOBE index.",
"http://pixelstech.net/article/index.php?id=1333969280"),
Link(1, 60254, 1333962645.0, 891,
"This explains why technical books are all ridiculously thick and overpriced",
"http://prog21.dadgum.com/65.html"),
Link(23, 62945, 1333894106.0, 351,
"Learn Haskell Fast and Hard",
"http://yannesposito.com/Scratch/en/blog/Haskell-the-Hard-Way/"),
Link(2, 6084, 1333996166.0, 81,
"Announcing Yesod 1.0- a robust, developer friendly, high performance web framework for Haskell",
"http://www.yesodweb.com/blog/2012/04/announcing-yesod-1-0"),
Link(3, 30305, 1333968061.0, 270,
"TIL about the Lisp Curse",
"http://www.winestockwebdesign.com/Essays/Lisp_Curse.html"),
Link(4, 59008, 1334016506.0, 19,
"The Downfall of Imperative Programming. Functional Programming and the Multicore Revolution",
"http://fpcomplete.com/the-downfall-of-imperative-programming/"),
Link(5, 8712, 1333993676.0, 26,
"Open Source - Twitter Stock Market Game - ",
"http://www.twitstreet.com/"),
Link(6, 48626, 1333975127.0, 63,
"First look: Qt 5 makes JavaScript a first-class citizen for app development",
"http://arstechnica.com/business/news/2012/04/an-in-depth-look-at-qt-5-making-javascript-a-first-class-citizen-for-native-cross-platform-developme.ars"),
Link(7, 30172, 1334017294.0, 5,
"Benchmark of Dictionary Structures", "http://lh3lh3.users.sourceforge.net/udb.shtml"),
Link(8, 678, 1334014446.0, 7,
"If It's Not on Prod, It Doesn't Count: The Value of Frequent Releases",
"http://bits.shutterstock.com/?p=165"),
Link(9, 29168, 1334006443.0, 18,
"Language proposal: dave",
"http://davelang.github.com/"),
Link(17, 48626, 1334020271.0, 1,
"LispNYC and EmacsNYC meetup Tuesday Night: Large Scale Development with Elisp ",
"http://www.meetup.com/LispNYC/events/47373722/"),
Link(101, 62443, 1334018620.0, 4,
"research!rsc: Zip Files All The Way Down",
"http://research.swtch.com/zip"),
Link(12, 10262, 1334018169.0, 5,
"The Tyranny of the Diff",
"http://michaelfeathers.typepad.com/michael_feathers_blog/2012/04/the-tyranny-of-the-diff.html"),
Link(13, 20831, 1333996529.0, 14,
"Understanding NIO.2 File Channels in Java 7",
"http://java.dzone.com/articles/understanding-nio2-file"),
Link(15, 62443, 1333900877.0, 1244,
"Why vector icons don't work",
"http://www.pushing-pixels.org/2011/11/04/about-those-vector-icons.html"),
Link(14, 30650, 1334013659.0, 3,
"Python - Getting Data Into Graphite - Code Examples",
"http://coreygoldberg.blogspot.com/2012/04/python-getting-data-into-graphite-code.html"),
Link(16, 15330, 1333985877.0, 9,
"Mozilla: The Web as the Platform and The Kilimanjaro Event",
"https://groups.google.com/forum/?fromgroups#!topic/mozilla.dev.planning/Y9v46wFeejA"),
Link(18, 62443, 1333939389.0, 104,
"github is making me feel stupid(er)",
"http://www.serpentine.com/blog/2012/04/08/github-is-making-me-feel-stupider/"),
Link(19, 6937, 1333949857.0, 39,
"BitC Retrospective: The Issues with Type Classes",
"http://www.bitc-lang.org/pipermail/bitc-dev/2012-April/003315.html"),
Link(20, 51067, 1333974585.0, 14,
"Object Oriented C: Class-like Structures",
"http://cecilsunkure.blogspot.com/2012/04/object-oriented-c-class-like-structures.html"),
Link(10, 23944, 1333943632.0, 188,
"The LOVE game framework version 0.8.0 has been released - with GLSL shader support!",
"https://love2d.org/forums/viewtopic.php?f=3&t=8750"),
Link(22, 39191, 1334005674.0, 11,
"An open letter to language designers: Please kill your sacred cows. (megarant)",
"http://joshondesign.com/2012/03/09/open-letter-language-designers"),
Link(21, 3777, 1333996565.0, 2,
"Developers guide to Garage48 hackatron",
"http://martingryner.com/developers-guide-to-garage48-hackatron/"),
Link(24, 48626, 1333934004.0, 17,
"An R programmer looks at Julia",
"http://www.r-bloggers.com/an-r-programmer-looks-at-julia/")]
# links is a list of Link objects. Links have a handful of properties. For
# example, a Link's number of votes can be accessed by link.votes if "link" is a
# Link.
# make the function query() return a list of Links submitted by user 62443, by
# submission time ascending
def query():
print "hello"
print [link for link in links if link.submitter_id == 62443] # is does not work
return sorted([link for link in links if link.submitter_id == 62443],key = lambda x: x[2])
query()
Run Code Online (Sandbox Code Playgroud)
当我is在这样的查询函数中使用时,[link for link in links if link.submitter_id is 62443]我会得到一个空列表.但如果我使用==它,它工作得很好.
在大多数情况下,代码直接来自udacity网站,但我也在我的本地机器上尝试过.同样的结果.所以我认为这个数字现在是不同的对象,但为什么呢?有需要吗?
编辑:是的.我承认这个问题是重复的,应该关闭.但它与第一个帖子不同,而不是第二个帖子.在发布之前我不知道这个问题.
我的问题是我认为数字对象总是会被重用.
感谢大家,我摆脱了一个坏习惯.
除了深入研究您正在使用的特定Python版本的实现细节之外,您的问题没有答案. 没有定义是否a == b暗示a is b何时a和b是数字.这通常是正确的,特别是对于"小整数",因为CPython保留了一些小整数对象的缓存,并且通常(并非总是!)为给定的小整数值返回相同的对象.但是关于这一点的任何内容都不会在发行版中定义,保证甚至始终相同.
考虑内存地址可能会有点帮助,因为这id()是在CPython中实现的方式.但是其他实现使用不同的实现id().例如,我被告知id()在Jython(用Java实现的Python)中实现是一个很大的痛苦,因为Java在垃圾收集期间可以自由地在内存中移动对象(CPython没有:在CPython中,对象总是占用最初分配的内存为此,直到物体成为垃圾).
唯一的预期 - 和支持 - 用于is检查对象的两个名称是否实际上解析为同一个对象.例如,无论何种类型b,之后
a = b
Run Code Online (Sandbox Code Playgroud)
一定是这样的
a is b
Run Code Online (Sandbox Code Playgroud)
是True.这有时很有用.
_sentinel = object() # create a unique object
def somefunc(optional=_sentinel):
if optional is _sentinel: # we know for sure nothing was passed
...
Run Code Online (Sandbox Code Playgroud)
另一个主要用途是保证为单身的少数对象. None,True并且False是这方面的例子,实际上写作是惯用的:
if a is None:
Run Code Online (Sandbox Code Playgroud)
代替:
if a == None:
Run Code Online (Sandbox Code Playgroud)
第一种方式成功,当且仅当a事实上绑定到单例None对象时,但第二种方式可能成功,如果a是任何类型a.__eq__(None)返回True.
不要is用于数字.那太疯狂了;-)
如果两个变量是同一个对象,并且用于检查相等性(如果对象相等),那么is检查标识是正确的.(所涉及的等级决定了相同的手段).==
你是正确的,is用来检查两个数字是否相等通常是有效的,因为Python重用数字,所以通常当它们相等时,它们也是相同的.
但你确实注意到这听起来如何.你应该通过身份检查来检查两个数字是否相等?不,当然不.您应该使用相等性检查来检查对象是否相等.就这么简单.
您经常可以使用身份检查来检查数字的相等性只是Python重用数字的副作用,它可以节省内存,这是一个实现细节.
此外,在Python中3 == 3.0,但是3 is not 3.0.所以你应该因此而使用==.
| 归档时间: |
|
| 查看次数: |
267 次 |
| 最近记录: |