Python 程序員最常犯的十個(gè)錯(cuò)誤,作為小白的你是不是也經(jīng)常犯几缭?

常見錯(cuò)誤1:錯(cuò)誤地將表達(dá)式作為函數(shù)的默認(rèn)參數(shù)

在Python中河泳,我們可以為函數(shù)的某個(gè)參數(shù)設(shè)置默認(rèn)值,使該參數(shù)成為可選參數(shù)年栓。雖然這是一個(gè)很好的語言特性拆挥,但是當(dāng)默認(rèn)值是可變類型時(shí),也會(huì)導(dǎo)致一些令人困惑的情況韵洋。我們來看看下面這個(gè)Python函數(shù)定義:

>>> def foo(bar=[]): # bar是可選參數(shù)竿刁,如果沒有提供bar的值,則默認(rèn)為[]搪缨,

... bar.append("baz") # 但是稍后我們會(huì)看到這行代碼會(huì)出現(xiàn)問題食拜。

... return bar

Python程序員常犯的一個(gè)錯(cuò)誤,就是想當(dāng)然地認(rèn)為:在每次調(diào)用函數(shù)時(shí)副编,如果沒有為可選參數(shù)傳入值负甸,那么這個(gè)可選參數(shù)就會(huì)被設(shè)置為指定的默認(rèn)值。在上面的代碼中痹届,你們可能覺得重復(fù)調(diào)用foo()函數(shù)應(yīng)該會(huì)一直返回’baz’呻待,因?yàn)槟銈兡J(rèn)每次foo()函數(shù)執(zhí)行時(shí)(沒有指定bar變量的值),bar變量都被設(shè)置為[](也就是队腐,一個(gè)新的空列表)蚕捉。

但是,實(shí)際運(yùn)行結(jié)果卻是這樣的:

>>> foo()

["baz"]

>>> foo()

["baz", "baz"]

>>> foo()

["baz", "baz", "baz"]

很奇怪吧柴淘?為什么每次調(diào)用foo()函數(shù)時(shí)迫淹,都會(huì)把”baz”這個(gè)默認(rèn)值添加到已有的列表中,而不是重新創(chuàng)建一個(gè)新的空列表呢为严?

答案就是敛熬,可選參數(shù)默認(rèn)值的設(shè)置在Python中只會(huì)被執(zhí)行一次,也就是定義該函數(shù)的時(shí)候第股。因此应民,只有當(dāng)foo()函數(shù)被定義時(shí),bar參數(shù)才會(huì)被初始化為默認(rèn)值(也就是,一個(gè)空列表)诲锹,但是之后每次foo()函數(shù)被調(diào)用時(shí)繁仁,都會(huì)繼續(xù)使用bar參數(shù)原先初始化生成的那個(gè)列表。

當(dāng)然辕狰,一個(gè)常見的解決辦法就是:

>>> def foo(bar=None):

... if bar is None: # or if not bar:

... bar = []

... bar.append("baz")

... return bar

...

>>> foo()

["baz"]

>>> foo()

["baz"]

>>> foo()

["baz"]

常見問題2:錯(cuò)誤地使用類變量

我們來看下面這個(gè)例子:

>>> class A(object):

... x = 1

...

>>> class B(A):

... pass

...

>>> class C(A):

... pass

...

>>> print A.x, B.x, C.x

1 1 1

這個(gè)結(jié)果很正常改备。

>>> B.x = 2

>>> print A.x, B.x, C.x

1 2 1

嗯控漠,結(jié)果和預(yù)計(jì)的一樣蔓倍。

>>> A.x = 3

>>> print A.x, B.x, C.x

3 2 3

在Python語言中,類變量是以字典的形式進(jìn)行處理的盐捷,并且遵循方法解析順序(Method Resolution Order偶翅,MRO)。因此碉渡,在上面的代碼中聚谁,由于類C中并沒有x這個(gè)屬性,解釋器將會(huì)查找它的基類(base class滞诺,盡管Python支持多重繼承形导,但是在這個(gè)例子中,C的基類只有A)习霹。換句話說朵耕,C并不沒有獨(dú)立于A、真正屬于自己的x屬性淋叶。所以阎曹,引用C.x實(shí)際上就是引用了A.x。如果沒有處理好這里的關(guān)系煞檩,就會(huì)導(dǎo)致示例中出現(xiàn)的這個(gè)問題处嫌。

常見錯(cuò)誤3:錯(cuò)誤地指定異常代碼塊(exception block)的參數(shù)

請(qǐng)看下面這段代碼:

>>> try:

... l = ["a", "b"]

... int(l[2])

... except ValueError, IndexError: # To catch both exceptions, right?

... pass

...

Traceback (most recent call last):

File "", line 3, in

IndexError: list index out of range

這段代碼的問題在于,except語句并不支持以這種方式指定異常斟湃。在Python 2.x中熏迹,需要使用變量e將異常綁定至可選的第二個(gè)參數(shù)中,才能進(jìn)一步查看異常的情況凝赛。因此注暗,在上述代碼中,except語句并沒有捕獲IndexError異常哄酝;而是將出現(xiàn)的異常綁定到了一個(gè)名為IndexError的參數(shù)中友存。

要想在except語句中正確地捕獲多個(gè)異常,則應(yīng)將第一個(gè)參數(shù)指定為元組陶衅,然后在元組中寫下希望捕獲的異常類型屡立。另外,為了提高可移植性,請(qǐng)使用as關(guān)鍵詞膨俐,Python 2和Python 3均支持這種用法勇皇。

>>> try:

... l = ["a", "b"]

... int(l[2])

... except (ValueError, IndexError) as e:

... pass

...

>>>

常見錯(cuò)誤4:錯(cuò)誤理解Python中的變量名解析

Python中的變量名解析遵循所謂的LEGB原則,也就是“L:本地作用域焚刺;E:上一層結(jié)構(gòu)中def或lambda的本地作用域敛摘;G:全局作用域;B:內(nèi)置作用域”(Local乳愉,Enclosing兄淫,Global,Builtin)蔓姚,按順序查找捕虽。看上去是不是很簡單坡脐?不過泄私,事實(shí)上這個(gè)原則的生效方式還是有著一些特殊之處。說到這點(diǎn)备闲,我們就不得不提下面這個(gè)常見的Python編程錯(cuò)誤晌端。請(qǐng)看下面的代碼:

>>> x = 10

>>> def foo():

... x += 1

... print x

...

>>> foo()

Traceback (most recent call last):

File "", line 1, in

File "", line 2, in foo

UnboundLocalError: local variable 'x' referenced before assignment

出了什么問題?

上述錯(cuò)誤的出現(xiàn)恬砂,是因?yàn)楫?dāng)你在某個(gè)作用域內(nèi)為變量賦值時(shí)咧纠,該變量被Python解釋器自動(dòng)視作該作用域的本地變量,并會(huì)取代任何上一層作用域中相同名稱的變量觉既。

正是因?yàn)檫@樣惧盹,才會(huì)出現(xiàn)一開始好好的代碼,在某個(gè)函數(shù)內(nèi)部添加了一個(gè)賦值語句之后卻出現(xiàn)了UnboundLocalError瞪讼,難怪會(huì)讓許多人吃驚钧椰。

在使用列表時(shí),Python程序員尤其容易陷入這個(gè)圈套符欠。

請(qǐng)看下面這個(gè)代碼示例:

>>> lst = [1, 2, 3]

>>> def foo1():

... lst.append(5) # 這里沒問題

...

>>> foo1()

>>> lst

[1, 2, 3, 5]

>>> lst = [1, 2, 3]

>>> def foo2():

... lst += [5] # ... 但這里就不對(duì)了!

...

>>> foo2()

Traceback (most recent call last):

File "", line 1, in

File "", line 2, in foo

UnboundLocalError: local variable 'lst' referenced before assignment

呃嫡霞?為什么函數(shù)foo1運(yùn)行正常,foo2卻出現(xiàn)了錯(cuò)誤希柿?

答案與上一個(gè)示例相同诊沪,但是卻更難捉摸清楚。foo1函數(shù)并沒有為lst變量進(jìn)行賦值曾撤,但是foo2卻有賦值端姚。我們知道,lst += [5]只是lst = lst + [5]的簡寫挤悉,從中我們就可以看出渐裸,foo2函數(shù)在嘗試為lst賦值(因此,被Python解釋器認(rèn)為是函數(shù)本地作用域的變量)。但是昏鹃,我們希望為lst賦的值卻又是基于lst變量本身(這時(shí)尚氛,也被認(rèn)為是函數(shù)本地作用域內(nèi)的變量),也就是說該變量還沒有被定義洞渤。這才出現(xiàn)了錯(cuò)誤阅嘶。

常見錯(cuò)誤5:在遍歷列表時(shí)更改列表

下面這段代碼的問題應(yīng)該算是十分明顯:

>>> odd = lambda x : bool(x % 2)

>>> numbers = [n for n in range(10)]

>>> for i in range(len(numbers)):

... if odd(numbers[i]):

... del numbers[i] # BAD: Deleting item from a list while iterating over it

...

Traceback (most recent call last):

File "", line 2, in

IndexError: list index out of range

在遍歷列表或數(shù)組的同時(shí)從中刪除元素,是任何經(jīng)驗(yàn)豐富的Python開發(fā)人員都會(huì)注意的問題载迄。但是盡管上面的示例十分明顯讯柔,資深開發(fā)人員在編寫更為復(fù)雜代碼的時(shí)候,也很可能會(huì)無意之下犯同樣的錯(cuò)誤宪巨。

幸運(yùn)的是磷杏,Python語言融合了許多優(yōu)雅的編程范式溜畅,如果使用得當(dāng)捏卓,可以極大地簡化代碼。簡化代碼還有一個(gè)好處慈格,就是不容易出現(xiàn)在遍歷列表時(shí)刪除元素這個(gè)錯(cuò)誤怠晴。能夠做到這點(diǎn)的一個(gè)編程范式就是列表解析式。而且浴捆,列表解析式在避免這個(gè)問題方面尤其有用蒜田,下面用列表解析式重新實(shí)現(xiàn)上面代碼的功能:

>>> odd = lambda x : bool(x % 2)

>>> numbers = [n for n in range(10)]

>>> numbers[:] = [n for n in numbers if not odd(n)] # ahh, the beauty of it all

>>> numbers

[0, 2, 4, 6, 8]

常見錯(cuò)誤6:不理解Python在閉包中如何綁定變量

請(qǐng)看下面這段代碼:

>>> def create_multipliers():

... return [lambda x : i * x for i in range(5)]

>>> for multiplier in create_multipliers():

... print multiplier(2)

...

你可能覺得輸出結(jié)果應(yīng)該是這樣的:

0

2

4

6

8

但是,實(shí)際的輸出結(jié)果卻是:

8

8

8

8

8

嚇了一跳吧选泻!

這個(gè)結(jié)果的出現(xiàn)冲粤,主要是因?yàn)镻ython中的遲綁定(late binding)機(jī)制,即閉包中變量的值只有在內(nèi)部函數(shù)被調(diào)用時(shí)才會(huì)進(jìn)行查詢页眯。因此梯捕,在上面的代碼中,每次create_multipliers()所返回的函數(shù)被調(diào)用時(shí)窝撵,都會(huì)在附近的作用域中查詢變量i的值(而到那時(shí)傀顾,循環(huán)已經(jīng)結(jié)束,所以變量i最后被賦予的值為4)碌奉。

要解決這個(gè)常見Python問題的方法中短曾,需要使用一些hack技巧:

>>> def create_multipliers():

... return [lambda x, i=i : i * x for i in range(5)]

...

>>> for multiplier in create_multipliers():

... print multiplier(2)

...

0

2

4

6

8

請(qǐng)注意!我們?cè)谶@里利用了默認(rèn)參數(shù)來實(shí)現(xiàn)這個(gè)lambda匿名函數(shù)赐劣。有人可能認(rèn)為這樣做很優(yōu)雅嫉拐,有人會(huì)覺得很巧妙,還有人會(huì)嗤之以鼻魁兼。但是婉徘,如果你是一名Python程序員,不管怎樣你都應(yīng)該要了解這種解決方法。

常見錯(cuò)誤7:模塊之間出現(xiàn)循環(huán)依賴(circular dependencies)

假設(shè)你有兩個(gè)文件判哥,分別是a.py和b.py献雅,二者相互引用,如下所示:

a.py文件中的代碼:

import b

def f():

return b.x

print f()

b.py文件中的代碼:

import a

x = 1

def g():

print a.f()

首先塌计,我們嘗試導(dǎo)入a.py模塊:

>>> import a

1

代碼運(yùn)行正常挺身。也許這出乎了你的意料。畢竟锌仅,我們這里存在循環(huán)引用這個(gè)問題章钾,想必應(yīng)該是會(huì)出現(xiàn)問題的,難道不是嗎热芹?

答案是贱傀,僅僅存在循環(huán)引用的情況本身并不會(huì)導(dǎo)致問題。如果一個(gè)模塊已經(jīng)被引用了伊脓,Python可以做到不再次進(jìn)行引用府寒。但是如果每個(gè)模塊試圖訪問其他模塊定義的函數(shù)或變量的時(shí)機(jī)不對(duì),那么你就很可能陷入困境报腔。

那么回到我們的示例株搔,當(dāng)我們導(dǎo)入a.py模塊時(shí),它在引用b.py模塊時(shí)是不會(huì)出現(xiàn)問題的纯蛾,因?yàn)閎.py模塊在被引用時(shí)纤房,并不需要訪問在a.py模塊中定義的任何變量或函數(shù)。b.py模塊中對(duì)a模塊唯一的引用翻诉,就是調(diào)用了a模塊的foo()函數(shù)炮姨。但是那個(gè)函數(shù)調(diào)用發(fā)生在g()函數(shù)當(dāng)中,而a.py或b.py模塊中都沒有調(diào)用g()函數(shù)碰煌。所以舒岸,不會(huì)出現(xiàn)問題。

但是拄查,如果我們?cè)囍鴮?dǎo)入b.py模塊呢(即之前沒有引用a.py模塊的前提下):

>>> import b

Traceback (most recent call last):

File "", line 1, in

File "b.py", line 1, in

import a

File "a.py", line 6, in

print f()

File "a.py", line 4, in f

return b.x

AttributeError: 'module' object has no attribute 'x'

糟糕吁津。情況不太妙!這里的問題是堕扶,在導(dǎo)入b.py的過程中碍脏,它試圖引用a.py模塊,而a.py模塊接著又要調(diào)用foo()函數(shù)稍算,這個(gè)foo()函數(shù)接著又試圖去訪問b.x變量典尾。但是這個(gè)時(shí)候,b.x變量還沒有被定義糊探,所以才出現(xiàn)了AttributeError異常钾埂。

解決這個(gè)問題有一種非常簡單的方法河闰,就是簡單地修改下b.py模塊,在g()函數(shù)內(nèi)部才引用a.py:

x = 1

def g():

import a # This will be evaluated only when g() is called

print a.f()

現(xiàn)在我們?cè)賹?dǎo)入b.py模塊的話褥紫,就不會(huì)出現(xiàn)任何問題了:

>>> import b

>>> b.g()

1 # Printed a first time since module 'a' calls 'print f()' at the end

1 # Printed a second time, this one is our call to 'g'

常見錯(cuò)誤8:模塊命名與Python標(biāo)準(zhǔn)庫模塊名沖突

Python語言的一大優(yōu)勢(shì)姜性,就是其本身自帶的強(qiáng)大標(biāo)準(zhǔn)庫。但是髓考,正因?yàn)槿绱瞬磕睿绻悴蝗タ桃庾⒁獾脑挘阋彩怯锌赡転樽约旱哪K取一個(gè)和Python自帶標(biāo)準(zhǔn)庫模塊相同的名字(例如氨菇,如果你的代碼中有一個(gè)模塊叫email.py儡炼,那么這就會(huì)與Python標(biāo)準(zhǔn)庫中同名的模塊相沖突。)

這很可能會(huì)給你帶來難纏的問題查蓉。舉個(gè)例子乌询,在導(dǎo)入模塊A的時(shí)候,假如該模塊A試圖引用Python標(biāo)準(zhǔn)庫中的模塊B豌研,但卻因?yàn)槟阋呀?jīng)有了一個(gè)同名模塊B妹田,模塊A會(huì)錯(cuò)誤地引用你自己代碼中的模塊B,而不是Python標(biāo)準(zhǔn)庫中的模塊B聂沙。這也是導(dǎo)致一些嚴(yán)重錯(cuò)誤的原因秆麸。

因此,Python程序員要格外注意及汉,避免使用與Python標(biāo)準(zhǔn)庫模塊相同的名稱。畢竟屯烦,修改自己模塊的名稱比提出PEP提議修改上游模塊名稱且讓提議通過坷随,要來得容易的多。

常見錯(cuò)誤9:未能解決Python 2與Python 3之間的差異

假設(shè)有下面這段代碼:

import sys

def bar(i):

if i == 1:

raise KeyError(1)

if i == 2:

raise ValueError(2)

def bad():

e = None

try:

bar(int(sys.argv[1]))

except KeyError as e:

print('key error')

except ValueError as e:

print('value error')

print(e)

bad()

如果是Python 2驻龟,那么代碼運(yùn)行正常:

$ python foo.py 1

key error

1

$ python foo.py 2

value error

2

但是現(xiàn)在温眉,我們換成Python 3再運(yùn)行一遍:

$ python3 foo.py 1

key error

Traceback (most recent call last):

File "foo.py", line 19, in

bad()

File "foo.py", line 17, in bad

print(e)

UnboundLocalError: local variable 'e' referenced before assignment

這到底是怎么回事?這里的“問題”是翁狐,在Python 3中类溢,異常對(duì)象在except代碼塊作用域之外是無法訪問的。(這么設(shè)計(jì)的原因在于露懒,如果不這樣的話闯冷,堆棧幀中就會(huì)一直保留它的引用循環(huán),直到垃圾回收器運(yùn)行懈词,將引用從內(nèi)存中清除蛇耀。)

避免這個(gè)問題的一種方法,就是在except代碼塊的作用域之外坎弯,維持一個(gè)對(duì)異常對(duì)象的引用(reference)纺涤,這樣異常對(duì)象就可以訪問了译暂。下面這段代碼就使用了這種方法,因此在Python 2和Python 3中的輸出結(jié)果是一致的:

import sys

def bar(i):

if i == 1:

raise KeyError(1)

if i == 2:

raise ValueError(2)

def good():

exception = None

try:

bar(int(sys.argv[1]))

except KeyError as e:

exception = e

print('key error')

except ValueError as e:

exception = e

print('value error')

print(exception)

good()

在Python 3下運(yùn)行代碼:

$ python3 foo.py 1

key error

1

$ python3 foo.py 2

value error

2

太棒了撩炊!

常見錯(cuò)誤10:錯(cuò)誤使用del方法

假設(shè)你在mod.py的文件中編寫了下面的代碼:

import foo

class Bar(object):

...

def __del__(self):

foo.cleanup(self.myhandle)

之后外永,你在another_mod.py文件中進(jìn)行如下操作:

import mod

mybar = mod.Bar()

如果你運(yùn)行another_mod.py模塊的話,將會(huì)出現(xiàn)AttributeError異常拧咳。

為什么象迎?因?yàn)楫?dāng)解釋器結(jié)束運(yùn)行的時(shí)候,該模塊的全局變量都會(huì)被設(shè)置為None呛踊。因此砾淌,在上述示例中演熟,當(dāng)__del__方法被調(diào)用之前蒜绽,foo已經(jīng)被設(shè)置成了None。

要想解決這個(gè)有點(diǎn)棘手的Python編程問題蜂厅,其中一個(gè)辦法就是使用atexit.register()方法愉择。這樣的話劫乱,當(dāng)你的程序執(zhí)行完成之后(即正常退出程序的情況下),你所指定的處理程序就會(huì)在解釋器關(guān)閉之前運(yùn)行锥涕。

應(yīng)用了上面這種方法衷戈,修改后的mod.py文件可能會(huì)是這樣子的:

import foo

import atexit

def cleanup(handle):

foo.cleanup(handle)

class Bar(object):

def __init__(self):

...

atexit.register(cleanup, self.myhandle)

這種實(shí)現(xiàn)支持在程序正常終止時(shí)干凈利落地調(diào)用任何必要的清理功能。很明顯层坠,上述示例中將會(huì)由foo.cleanup函數(shù)來決定如何處理self.myhandle所綁定的對(duì)象殖妇。

綜述


Python是一門強(qiáng)大而又靈活的編程語言,提供的許多編程機(jī)制和范式可以極大地提高工作效率破花。但是與任何軟件工具或語言一樣谦趣,如果對(duì)該語言的能力理解有限或無法欣賞,那么有時(shí)候自己反而會(huì)被阻礙座每,而不是受益了前鹅。正如一句諺語所說,“自以為知道夠多峭梳,但實(shí)則會(huì)給自己或別人帶來危險(xiǎn)”(knowing enough to be dangerous)舰绘。(譯者注:這句諺語的意思是,自以為已經(jīng)對(duì)某件事情了解足夠葱椭,但在實(shí)際去執(zhí)行或?qū)嵤r(shí)捂寿,卻會(huì)給自己和別人帶來危險(xiǎn)。)

不斷地熟悉Python語言的一些細(xì)微之處挫以,尤其是本文中提到的10大常見錯(cuò)誤者蠕,將會(huì)幫助你有效地使用這門語言,同時(shí)也能避免犯一些比較常見的錯(cuò)誤掐松。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末踱侣,一起剝皮案震驚了整個(gè)濱河市粪小,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌抡句,老刑警劉巖探膊,帶你破解...
    沈念sama閱讀 219,490評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異待榔,居然都是意外死亡逞壁,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門锐锣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來腌闯,“玉大人,你說我怎么就攤上這事雕憔∽丝ィ” “怎么了?”我有些...
    開封第一講書人閱讀 165,830評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵斤彼,是天一觀的道長分瘦。 經(jīng)常有香客問我,道長琉苇,這世上最難降的妖魔是什么嘲玫? 我笑而不...
    開封第一講書人閱讀 58,957評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮并扇,結(jié)果婚禮上去团,老公的妹妹穿的比我還像新娘。我一直安慰自己拜马,他們只是感情好渗勘,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,974評(píng)論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著俩莽,像睡著了一般。 火紅的嫁衣襯著肌膚如雪乔遮。 梳的紋絲不亂的頭發(fā)上扮超,一...
    開封第一講書人閱讀 51,754評(píng)論 1 307
  • 那天,我揣著相機(jī)與錄音蹋肮,去河邊找鬼出刷。 笑死,一個(gè)胖子當(dāng)著我的面吹牛坯辩,可吹牛的內(nèi)容都是我干的馁龟。 我是一名探鬼主播,決...
    沈念sama閱讀 40,464評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼漆魔,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼坷檩!你這毒婦竟也來了却音?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤矢炼,失蹤者是張志新(化名)和其女友劉穎系瓢,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體句灌,經(jīng)...
    沈念sama閱讀 45,847評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡夷陋,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,995評(píng)論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了胰锌。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片骗绕。...
    茶點(diǎn)故事閱讀 40,137評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖资昧,靈堂內(nèi)的尸體忽然破棺而出酬土,到底是詐尸還是另有隱情,我是刑警寧澤榛搔,帶...
    沈念sama閱讀 35,819評(píng)論 5 346
  • 正文 年R本政府宣布诺凡,位于F島的核電站,受9級(jí)特大地震影響践惑,放射性物質(zhì)發(fā)生泄漏腹泌。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,482評(píng)論 3 331
  • 文/蒙蒙 一尔觉、第九天 我趴在偏房一處隱蔽的房頂上張望凉袱。 院中可真熱鬧,春花似錦侦铜、人聲如沸专甩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽涤躲。三九已至,卻和暖如春贡未,著一層夾襖步出監(jiān)牢的瞬間种樱,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評(píng)論 1 272
  • 我被黑心中介騙來泰國打工俊卤, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留嫩挤,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,409評(píng)論 3 373
  • 正文 我出身青樓消恍,卻偏偏與公主長得像岂昭,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子狠怨,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,086評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容